diff -Nur opensim-/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs opensim/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs
--- opensim-/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs 2010-01-10 23:43:49.000000000 +0900
+++ opensim/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs 2010-01-10 23:44:24.000000000 +0900
@@ -572,6 +572,7 @@
scene.RegionInfo.RegionLocX, scene.RegionInfo.RegionLocY));
region.ExternalHostName = (string) requestData["external_address"];
+ region.ExternalIPAddress = (string) requestData["external_address"]; // Fumi.Iseki
string masterFirst = (string) requestData["region_master_first"];
string masterLast = (string) requestData["region_master_last"];
diff -Nur opensim-/OpenSim/Client/Linden/LLStandaloneLoginService.cs opensim/OpenSim/Client/Linden/LLStandaloneLoginService.cs
--- opensim-/OpenSim/Client/Linden/LLStandaloneLoginService.cs 2010-01-10 23:43:49.000000000 +0900
+++ opensim/OpenSim/Client/Linden/LLStandaloneLoginService.cs 2010-01-10 23:44:24.000000000 +0900
@@ -142,9 +142,15 @@
protected override bool PrepareLoginToRegion(
RegionInfo regionInfo, UserProfileData user, LoginResponse response, IPEndPoint remoteClient)
{
- IPEndPoint endPoint = regionInfo.ExternalEndPoint;
- response.SimAddress = endPoint.Address.ToString();
- response.SimPort = (uint)endPoint.Port;
+ // by Fumi.Iseki for NAT
+ IPAddress extip = NetworkUtil.GetIPfromString(regionInfo.ExternalIPAddress);
+ IPAddress simip = NetworkUtil.GetEffectiveIP(remoteClient.Address, regionInfo.InternalEndPoint.Address, extip, null);
+
+ //IPEndPoint endPoint = regionInfo.ExternalEndPoint;
+ //response.SimAddress = endPoint.Address.ToString();
+ //response.SimPort = (uint)endPoint.Port;
+ response.SimAddress = simip.ToString();
+ response.SimPort = (uint)regionInfo.InternalEndPoint.Port;
response.RegionX = regionInfo.RegionLocX;
response.RegionY = regionInfo.RegionLocY;
diff -Nur opensim-/OpenSim/Data/MSSQL/MSSQLGridData.cs opensim/OpenSim/Data/MSSQL/MSSQLGridData.cs
--- opensim-/OpenSim/Data/MSSQL/MSSQLGridData.cs 2010-01-10 23:43:49.000000000 +0900
+++ opensim/OpenSim/Data/MSSQL/MSSQLGridData.cs 2010-01-10 23:44:24.000000000 +0900
@@ -412,12 +412,16 @@
// Region Server
retval.regionDataURI = reader["regionDataURI"].ToString();
retval.regionOnline = false; // Needs to be pinged before this can be set.
- retval.serverIP = reader["serverIP"].ToString();
+ // Fumi.Iseki
+ retval.serverIPadr = reader["serverIP"].ToString();
retval.serverPort = Convert.ToUInt32(reader["serverPort"]);
retval.serverURI = reader["serverURI"].ToString();
retval.httpPort = Convert.ToUInt32(reader["serverHttpPort"].ToString());
retval.remotingPort = Convert.ToUInt32(reader["serverRemotingPort"].ToString());
+ // Fumi.Iseki
+ retval.serverName = retval.serverURI.Split(new char[] { '/', ':' })[3];
+
// Location
retval.regionLocX = Convert.ToUInt32(reader["locX"].ToString());
retval.regionLocY = Convert.ToUInt32(reader["locY"].ToString());
@@ -479,7 +483,7 @@
command.Parameters.Add(database.CreateParameter("regionSecret", profile.regionSecret));
command.Parameters.Add(database.CreateParameter("regionSendKey", profile.regionSendKey));
command.Parameters.Add(database.CreateParameter("regionDataURI", profile.regionDataURI));
- command.Parameters.Add(database.CreateParameter("serverIP", profile.serverIP));
+ command.Parameters.Add(database.CreateParameter("serverIP", profile.serverIPadr)); // by Fumi.Iseki
command.Parameters.Add(database.CreateParameter("serverPort", profile.serverPort));
command.Parameters.Add(database.CreateParameter("serverURI", profile.serverURI));
command.Parameters.Add(database.CreateParameter("locX", profile.regionLocX));
@@ -545,7 +549,7 @@
command.Parameters.Add(database.CreateParameter("regionSecret", profile.regionSecret));
command.Parameters.Add(database.CreateParameter("regionSendKey", profile.regionSendKey));
command.Parameters.Add(database.CreateParameter("regionDataURI", profile.regionDataURI));
- command.Parameters.Add(database.CreateParameter("serverIP", profile.serverIP));
+ command.Parameters.Add(database.CreateParameter("serverIP", profile.serverIPadr)); // by Fumi.Iseki
command.Parameters.Add(database.CreateParameter("serverPort", profile.serverPort));
command.Parameters.Add(database.CreateParameter("serverURI", profile.serverURI));
command.Parameters.Add(database.CreateParameter("locX", profile.regionLocX));
diff -Nur opensim-/OpenSim/Data/MySQL/MySQLManager.cs opensim/OpenSim/Data/MySQL/MySQLManager.cs
--- opensim-/OpenSim/Data/MySQL/MySQLManager.cs 2010-01-10 23:43:49.000000000 +0900
+++ opensim/OpenSim/Data/MySQL/MySQLManager.cs 2010-01-10 23:44:24.000000000 +0900
@@ -406,12 +406,16 @@
// Region Server
retval.regionDataURI = (string) reader["regionDataURI"];
retval.regionOnline = false; // Needs to be pinged before this can be set.
- retval.serverIP = (string) reader["serverIP"];
+ // Fumi.Iseki
+ retval.serverIPadr = (string) reader["serverIP"];
retval.serverPort = (uint) reader["serverPort"];
retval.serverURI = (string) reader["serverURI"];
retval.httpPort = Convert.ToUInt32(reader["serverHttpPort"].ToString());
retval.remotingPort = Convert.ToUInt32(reader["serverRemotingPort"].ToString());
+ // Fumi.Iseki
+ retval.serverName = retval.serverURI.Split(new char[] { '/', ':' })[3];
+
// Location
retval.regionLocX = Convert.ToUInt32(reader["locX"].ToString());
retval.regionLocY = Convert.ToUInt32(reader["locY"].ToString());
@@ -1003,7 +1007,7 @@
parameters["?regionSecret"] = regiondata.regionSecret.ToString();
parameters["?regionSendKey"] = regiondata.regionSendKey.ToString();
parameters["?regionDataURI"] = regiondata.regionDataURI.ToString();
- parameters["?serverIP"] = regiondata.serverIP.ToString();
+ parameters["?serverIP"] = regiondata.serverIPadr.ToString(); // Fumi.Iseki
parameters["?serverPort"] = regiondata.serverPort.ToString();
parameters["?serverURI"] = regiondata.serverURI.ToString();
parameters["?locX"] = regiondata.regionLocX.ToString();
diff -Nur opensim-/OpenSim/Data/RegionProfileData.cs opensim/OpenSim/Data/RegionProfileData.cs
--- opensim-/OpenSim/Data/RegionProfileData.cs 2010-01-10 23:43:49.000000000 +0900
+++ opensim/OpenSim/Data/RegionProfileData.cs 2010-01-10 23:44:24.000000000 +0900
@@ -25,6 +25,16 @@
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+
+/*
+by Fumi.Iseki
+
+ serverIP -> serverName
+ serverIPadr is new created.
+*/
+
+
+
using System;
using System.Collections;
using Nwc.XmlRpc;
@@ -77,7 +87,8 @@
///
/// Information about the server that the region is currently hosted on
///
- public string serverIP = String.Empty;
+ public string serverName = String.Empty; // by Fumi.Iseki
+ public string serverIPadr = String.Empty;
public uint serverPort;
public string serverURI = String.Empty;
@@ -188,10 +199,16 @@
get { return regionOnline; }
set { regionOnline = value; }
}
- public string ServerIP
+ public string ServerIPadr
+ {
+ get { return serverIPadr; }
+ set { serverIPadr = value; }
+ }
+ // by Fumi.Iseki
+ public string ServerName
{
- get { return serverIP; }
- set { serverIP = value; }
+ get { return serverName; }
+ set { serverName = value; }
}
public uint ServerPort
{
@@ -298,7 +315,8 @@
public RegionInfo ToRegionInfo()
{
- return RegionInfo.Create(UUID, regionName, regionLocX, regionLocY, serverIP, httpPort, serverPort, remotingPort, serverURI);
+ // by Fumi.Iseki for NAT
+ return RegionInfo.Create(UUID, regionName, regionLocX, regionLocY, serverName, serverIPadr, httpPort, serverPort, remotingPort, serverURI);
}
public static RegionProfileData FromRegionInfo(RegionInfo regionInfo)
@@ -308,13 +326,15 @@
return null;
}
+ // by Fumi.Iseki
return Create(regionInfo.RegionID, regionInfo.RegionName, regionInfo.RegionLocX,
- regionInfo.RegionLocY, regionInfo.ExternalHostName,
+ regionInfo.RegionLocY, regionInfo.ExternalHostName, regionInfo.ExternalIPAddress,
(uint) regionInfo.ExternalEndPoint.Port, regionInfo.HttpPort, regionInfo.RemotingPort,
regionInfo.ServerURI, regionInfo.AccessLevel);
}
- public static RegionProfileData Create(UUID regionID, string regionName, uint locX, uint locY, string externalHostName, uint regionPort, uint httpPort, uint remotingPort, string serverUri, byte access)
+ // by Fumi.Iseki for NAT
+ public static RegionProfileData Create(UUID regionID, string regionName, uint locX, uint locY, string externalHostName, string externalIP, uint regionPort, uint httpPort, uint remotingPort, string serverUri, byte access)
{
RegionProfileData regionProfile;
regionProfile = new RegionProfileData();
@@ -323,7 +343,12 @@
regionProfile.regionHandle =
Utils.UIntsToLong((regionProfile.regionLocX * Constants.RegionSize),
(regionProfile.regionLocY*Constants.RegionSize));
- regionProfile.serverIP = externalHostName;
+ // by Fumi.Iseki
+ //regionProfile.serverIP = externalHostName;
+ if (externalIP==null || externalIP=="0.0.0.0") regionProfile.serverIPadr = externalHostName;
+ else regionProfile.serverIPadr = externalIP;
+ regionProfile.serverName = externalHostName;
+
regionProfile.serverPort = regionPort;
regionProfile.httpPort = httpPort;
regionProfile.remotingPort = remotingPort;
diff -Nur opensim-/OpenSim/Data/RegionProfileServiceProxy.cs opensim/OpenSim/Data/RegionProfileServiceProxy.cs
--- opensim-/OpenSim/Data/RegionProfileServiceProxy.cs 2010-01-10 23:43:49.000000000 +0900
+++ opensim/OpenSim/Data/RegionProfileServiceProxy.cs 2010-01-10 23:44:24.000000000 +0900
@@ -58,7 +58,10 @@
{
uint locX = Convert.ToUInt32((string)responseData["region_locx"]);
uint locY = Convert.ToUInt32((string)responseData["region_locy"]);
- string externalHostName = (string)responseData["sim_ip"];
+ // by Fumi.Iseki
+ string externalIP = (string)responseData["sim_ip"];
+ string externalHostName = (string)responseData["sim_name"];
+
uint simPort = Convert.ToUInt32((string)responseData["sim_port"]);
uint httpPort = Convert.ToUInt32((string)responseData["http_port"]);
uint remotingPort = Convert.ToUInt32((string)responseData["remoting_port"]);
@@ -67,7 +70,7 @@
string regionName = (string)responseData["region_name"];
byte access = Convert.ToByte((string)responseData["access"]);
- simData = RegionProfileData.Create(regionID, regionName, locX, locY, externalHostName, simPort, httpPort, remotingPort, serverUri, access);
+ simData = RegionProfileData.Create(regionID, regionName, locX, locY, externalHostName, externalIP, simPort, httpPort, remotingPort, serverUri, access);
}
return simData;
diff -Nur opensim-/OpenSim/Data/SQLite/SQLiteManager.cs opensim/OpenSim/Data/SQLite/SQLiteManager.cs
--- opensim-/OpenSim/Data/SQLite/SQLiteManager.cs 2010-01-10 23:43:49.000000000 +0900
+++ opensim/OpenSim/Data/SQLite/SQLiteManager.cs 2010-01-10 23:44:24.000000000 +0900
@@ -128,10 +128,14 @@
// Region Server
retval.regionDataURI = (string) reader["regionDataURI"];
retval.regionOnline = false; // Needs to be pinged before this can be set.
- retval.serverIP = (string) reader["serverIP"];
+ // Fumi.Iseki
+ retval.serverIPadr = (string) reader["serverIP"];
retval.serverPort = (uint) reader["serverPort"];
retval.serverURI = (string) reader["serverURI"];
+ // Fumi.Iseki
+ retval.serverName = retval.serverURI.Split(new char[] { '/', ':' })[3];
+
// Location
retval.regionLocX = (uint) ((int) reader["locX"]);
retval.regionLocY = (uint) ((int) reader["locY"]);
@@ -186,7 +190,7 @@
parameters["regionRecvKey"] = profile.regionRecvKey;
parameters["regionSendKey"] = profile.regionSendKey;
parameters["regionDataURI"] = profile.regionDataURI;
- parameters["serverIP"] = profile.serverIP;
+ parameters["serverIP"] = profile.serverIPadr; // by Fumi.Iseki
parameters["serverPort"] = profile.serverPort.ToString();
parameters["serverURI"] = profile.serverURI;
parameters["locX"] = profile.regionLocX.ToString();
diff -Nur opensim-/OpenSim/Framework/Communications/Clients/GridClient.cs opensim/OpenSim/Framework/Communications/Clients/GridClient.cs
--- opensim-/OpenSim/Framework/Communications/Clients/GridClient.cs 2010-01-10 23:43:49.000000000 +0900
+++ opensim/OpenSim/Framework/Communications/Clients/GridClient.cs 2010-01-10 23:44:24.000000000 +0900
@@ -238,7 +238,10 @@
uint regX = Convert.ToUInt32((string)responseData["region_locx"]);
uint regY = Convert.ToUInt32((string)responseData["region_locy"]);
- string externalHostName = (string)responseData["sim_ip"];
+ // by Fumi.Iseki for NAT
+ string externalIP = (string)responseData["sim_ip"];
+ string externalHostName = (string)responseData["sim_name"];
+
uint simPort = Convert.ToUInt32(responseData["sim_port"]);
string regionName = (string)responseData["region_name"];
UUID regionID = new UUID((string)responseData["region_UUID"]);
@@ -257,7 +260,8 @@
// string externalUri = (string) responseData["sim_uri"];
//IPEndPoint neighbourInternalEndPoint = new IPEndPoint(IPAddress.Parse(internalIpStr), (int) port);
- regionInfo = RegionInfo.Create(regionID, regionName, regX, regY, externalHostName, httpPort, simPort, remotingPort, simURI);
+ // Fumi.Iseki
+ regionInfo = RegionInfo.Create(regionID, regionName, regX, regY, externalHostName, externalIP, httpPort, simPort, remotingPort, simURI);
}
catch (Exception e)
{
@@ -368,12 +372,15 @@
{
uint regX = Convert.ToUInt32((string)responseData[prefix + "region_locx"]);
uint regY = Convert.ToUInt32((string)responseData[prefix + "region_locy"]);
+ // by Fumi.Iseki
+ string internalName = (string)responseData[prefix + "sim_name"];
string internalIpStr = (string)responseData[prefix + "sim_ip"];
uint port = Convert.ToUInt32(responseData[prefix + "sim_port"]);
IPEndPoint neighbourInternalEndPoint = new IPEndPoint(Util.GetHostFromDNS(internalIpStr), (int)port);
- RegionInfo regionInfo = new RegionInfo(regX, regY, neighbourInternalEndPoint, internalIpStr);
+ // by Fumi.Iseki
+ RegionInfo regionInfo = new RegionInfo(regX, regY, neighbourInternalEndPoint, internalName, internalIpStr);
regionInfo.RemotingPort = Convert.ToUInt32((string)responseData[prefix + "remoting_port"]);
regionInfo.RemotingAddress = internalIpStr;
diff -Nur opensim-/OpenSim/Framework/Communications/Tests/LoginServiceTests.cs opensim/OpenSim/Framework/Communications/Tests/LoginServiceTests.cs
--- opensim-/OpenSim/Framework/Communications/Tests/LoginServiceTests.cs 2010-01-10 23:43:49.000000000 +0900
+++ opensim/OpenSim/Framework/Communications/Tests/LoginServiceTests.cs 2010-01-10 23:44:24.000000000 +0900
@@ -56,6 +56,7 @@
private string m_firstName = "Adam";
private string m_lastName = "West";
private string m_regionExternalName = "localhost";
+ private string m_regionExternalIP = "127.0.0.1"; // Fumi.Iseki
private IPEndPoint m_capsEndPoint;
private TestCommunicationsManager m_commsManager;
@@ -73,7 +74,9 @@
m_regionConnector = new TestLoginToRegionConnector();
m_testScene = SceneSetupHelpers.SetupScene(m_commsManager, "");
- m_regionConnector.AddRegion(new RegionInfo(42, 43, m_capsEndPoint, m_regionExternalName));
+ // Fumi.Iseki
+ //m_regionConnector.AddRegion(new RegionInfo(42, 43, m_capsEndPoint, m_regionExternalName));
+ m_regionConnector.AddRegion(new RegionInfo(42, 43, m_capsEndPoint, m_regionExternalName, m_regionExternalIP));
//IInventoryService m_inventoryService = new MockInventoryService();
diff -Nur opensim-/OpenSim/Framework/NetworkUtil.cs opensim/OpenSim/Framework/NetworkUtil.cs
--- opensim-/OpenSim/Framework/NetworkUtil.cs 2010-01-10 23:43:49.000000000 +0900
+++ opensim/OpenSim/Framework/NetworkUtil.cs 2010-01-10 23:44:24.000000000 +0900
@@ -56,6 +56,114 @@
get { return m_disabled; }
}
+
+
+ // Fumi.Iseki
+ public static IPAddress GetIPfromString(string str)
+ {
+ IPAddress ip = null;
+ if (IPAddress.TryParse(str, out ip))
+ {
+ return ip;
+ }
+
+ foreach (IPAddress host in Dns.GetHostAddresses(str))
+ {
+ if (host.AddressFamily==AddressFamily.InterNetwork)
+ {
+ return host;
+ }
+ }
+ return ip;
+ }
+
+
+
+ // Fumi.Iseki
+ public static IPEndPoint GetEffectiveIP(IPAddress viewer, IPEndPoint internalPoint, IPEndPoint externalPoint, IPEndPoint myExternalPoint)
+ {
+ IPAddress ip;
+
+ if (myExternalPoint==null)
+ {
+ ip = GetEffectiveIP(viewer, internalPoint.Address, externalPoint.Address, null);
+ }
+ else {
+ ip = GetEffectiveIP(viewer, internalPoint.Address, externalPoint.Address, myExternalPoint.Address);
+ }
+ return new IPEndPoint(ip.Address, internalPoint.Port);
+ }
+
+
+
+ // Fumi.Iseki
+ public static IPAddress GetEffectiveIP(IPAddress viewer, IPAddress internalIP, IPAddress externalIP, IPAddress myExternalIP)
+ {
+ foreach (IPAddress host in Dns.GetHostAddresses(Dns.GetHostName()))
+ {
+ if (host.Equals(viewer) && host.AddressFamily==AddressFamily.InterNetwork)
+ {
+ m_log.Info("[NetworkUtil.GetEffectiveIP] Localhost user detected, sending them '" + host.ToString() + "'");
+ return host;
+ }
+ }
+
+ string externalip = externalIP.ToString();
+ if (externalip==null || externalip=="0.0.0.0")
+ {
+ m_log.Info("[NetworkUtil.GetEffectiveIP] Local LAN user detected (type 0), sending them '" + internalIP.ToString() + "'");
+ return internalIP;
+ }
+
+ if (viewer.Equals(externalIP))
+ {
+ m_log.Info("[NetworkUtil.GetEffectiveIP] Local LAN user detected (type 1), sending them '" + internalIP.ToString() + "'");
+ return internalIP;
+ }
+
+ if (myExternalIP!=null && !externalIP.Equals(myExternalIP))
+ {
+ m_log.Info("[NetworkUtil.GetEffectiveIP] Remote LAN user detected (type 0), sending them '" + externalIP.ToString() + "'");
+ return externalIP;
+ }
+
+
+ // Check for same LAN segment
+ foreach (KeyValuePair subnet in m_subnets)
+ {
+ byte[] subnetBytes = subnet.Value.GetAddressBytes();
+ byte[] localBytes = subnet.Key.GetAddressBytes();
+ byte[] destBytes = viewer.GetAddressBytes();
+
+ if (subnetBytes.Length != destBytes.Length || subnetBytes.Length != localBytes.Length) return internalIP;
+
+ bool valid = true;
+ for (int i = 0; i < subnetBytes.Length; i++)
+ {
+ if ((localBytes[i] & subnetBytes[i]) != (destBytes[i] & subnetBytes[i]))
+ {
+ valid = false;
+ break;
+ }
+ }
+ if (subnet.Key.AddressFamily != AddressFamily.InterNetwork) {
+ valid = false;
+ }
+
+ if (valid)
+ {
+ m_log.Info("[NetworkUtil.GetEffectiveIP] Local LAN user detected (type 2), sending them '" + internalIP.ToString() + "'");
+ return internalIP;
+ }
+ }
+
+ // Otherwise, return outside address
+ m_log.Info("[NetworkUtil.GetEffectiveIP] Remote LAN user detected (type 1), sending them '" + externalIP.ToString() + "'");
+ return externalIP;
+ }
+
+
+
// IPv4Address, Subnet
static readonly Dictionary m_subnets = new Dictionary();
@@ -190,9 +298,17 @@
{
if (address.Address.AddressFamily == AddressFamily.InterNetwork)
{
- if (address.IPv4Mask != null)
+ // Fumi.Iseki for mono
+ try
+ {
+ if (address.IPv4Mask != null)
+ {
+ m_subnets.Add(address.Address, address.IPv4Mask);
+ }
+ }
+ catch (NotImplementedException)
{
- m_subnets.Add(address.Address, address.IPv4Mask);
+ m_subnets.Add(address.Address, IPAddress.Parse("255.255.255.0"));
}
}
}
diff -Nur opensim-/OpenSim/Framework/RegionInfo.cs opensim/OpenSim/Framework/RegionInfo.cs
--- opensim-/OpenSim/Framework/RegionInfo.cs 2010-01-10 23:43:49.000000000 +0900
+++ opensim/OpenSim/Framework/RegionInfo.cs 2010-01-10 23:44:24.000000000 +0900
@@ -79,6 +79,7 @@
protected bool Allow_Alternate_Ports;
public bool m_allow_alternate_ports;
protected string m_externalHostName;
+ protected string m_externalIPAddress; // Fumi.Iseki
protected IPEndPoint m_internalEndPoint;
protected uint? m_regionLocX;
protected uint? m_regionLocY;
@@ -168,13 +169,16 @@
configMember.performConfigurationRetrieve();
}
- public RegionInfo(uint regionLocX, uint regionLocY, IPEndPoint internalEndPoint, string externalUri)
+ // by Fumi.Iseki for NAT added externalIP
+ public RegionInfo(uint regionLocX, uint regionLocY, IPEndPoint internalEndPoint, string externalUri, string externalIP)
{
m_regionLocX = regionLocX;
m_regionLocY = regionLocY;
m_internalEndPoint = internalEndPoint;
m_externalHostName = externalUri;
+ if (externalIP==null) externalIP = "0.0.0.0";
+ m_externalIPAddress = externalIP;
}
public RegionInfo()
@@ -280,13 +284,26 @@
{
get
{
+ // by Fumi.Iseki for NAT
+ if (m_externalIPAddress!=null && m_externalIPAddress!="0.0.0.0")
+ {
+ IPAddress ip = NetworkUtil.GetIPfromString(m_externalIPAddress);
+ return new IPEndPoint(ip, m_internalEndPoint.Port);
+ }
+
// Old one defaults to IPv6
//return new IPEndPoint(Dns.GetHostAddresses(m_externalHostName)[0], m_internalEndPoint.Port);
- IPAddress ia = null;
+ // by Fumi.Iseki for NAT
+ //IPAddress ia = null;
// If it is already an IP, don't resolve it - just return directly
- if (IPAddress.TryParse(m_externalHostName, out ia))
+ //if (IPAddress.TryParse(m_externalHostName, out ia))
+ IPAddress ia = NetworkUtil.GetIPfromString(m_externalHostName);
+ if (ia!=null)
+ {
+ m_externalIPAddress = ia.ToString();
return new IPEndPoint(ia, m_internalEndPoint.Port);
+ }
// Reset for next check
ia = null;
@@ -314,7 +331,17 @@
return new IPEndPoint(ia, m_internalEndPoint.Port);
}
- set { m_externalHostName = value.ToString(); }
+ set
+ {
+ m_externalHostName = value.ToString();
+
+ // by Fumi.Iseki for NAT
+ IPAddress ia = NetworkUtil.GetIPfromString(m_externalHostName);
+ if (ia!=null)
+ {
+ m_externalIPAddress = ia.ToString();
+ }
+ }
}
public string ExternalHostName
@@ -323,6 +350,13 @@
set { m_externalHostName = value; }
}
+ // by Fumi.Iseki for NAT
+ public string ExternalIPAddress
+ {
+ get { return m_externalIPAddress; }
+ set { m_externalIPAddress = value; }
+ }
+
public IPEndPoint InternalEndPoint
{
get { return m_internalEndPoint; }
@@ -442,6 +476,10 @@
address = IPAddress.Parse(MainConsole.Instance.CmdPrompt("Internal IP address", "0.0.0.0"));
config.Set("InternalAddress", address.ToString());
}
+
+ // Fumi.Iseki
+ if (address.ToString()=="0.0.0.0") address = NetworkUtil.GetIPfromString("");
+
int port;
@@ -488,6 +526,27 @@
m_externalHostName = externalName;
+ // External IP for NAT
+ // by Fumi.Iseki
+ string externalIP;
+
+ if (config.Contains("ExternalAddress"))
+ {
+ externalIP = config.GetString("ExternalAddress", "0.0.0.0");
+ }
+ else
+ {
+ externalIP = "0.0.0.0"; // NAT is not used
+ }
+
+ if (externalIP=="0.0.0.0")
+ {
+ IPAddress ip = NetworkUtil.GetIPfromString(m_externalHostName);
+ if (ip!=null) externalIP = ip.ToString();
+ }
+ m_externalIPAddress = externalIP;
+
+
// Master avatar cruft
//
string masterAvatarUUID;
@@ -563,6 +622,7 @@
config.Set("AllowAlternatePorts", m_allow_alternate_ports.ToString());
config.Set("ExternalHostName", m_externalHostName);
+ //config.Set("ExternalIPAddress", m_externalIPAddress); // by Fumi.Iseki
if (MasterAvatarAssignedUUID != UUID.Zero)
{
@@ -651,6 +711,9 @@
configMember.addConfigurationOption("external_host_name",
ConfigurationOption.ConfigurationTypes.TYPE_STRING_NOT_EMPTY,
"External Host Name", m_externalHostName, true);
+ configMember.addConfigurationOption("external_ip_address", // by Fumi.Iseki for NAT
+ ConfigurationOption.ConfigurationTypes.TYPE_STRING_NOT_EMPTY,
+ "External IP Address", m_externalIPAddress, true);
configMember.addConfigurationOption("master_avatar_uuid", ConfigurationOption.ConfigurationTypes.TYPE_UUID,
"Master Avatar UUID", MasterAvatarAssignedUUID.ToString(), true);
configMember.addConfigurationOption("master_avatar_first",
@@ -711,6 +774,9 @@
configMember.addConfigurationOption("external_host_name",
ConfigurationOption.ConfigurationTypes.TYPE_STRING_NOT_EMPTY,
"External Host Name", "127.0.0.1", false);
+ configMember.addConfigurationOption("external_ip_address", // by Fumi.Iseki for NAT
+ ConfigurationOption.ConfigurationTypes.TYPE_STRING_NOT_EMPTY,
+ "External IP Address", "0.0.0.0", false);
configMember.addConfigurationOption("master_avatar_uuid", ConfigurationOption.ConfigurationTypes.TYPE_UUID,
"Master Avatar UUID", UUID.Zero.ToString(), true);
configMember.addConfigurationOption("master_avatar_first",
@@ -797,6 +863,9 @@
m_externalHostName = Util.GetLocalHost().ToString();
}
break;
+ case "external_ip_address": // by Fumi.Iseki
+ m_externalIPAddress = (string) configuration_result;
+ break;
case "master_avatar_uuid":
MasterAvatarAssignedUUID = (UUID) configuration_result;
break;
@@ -857,6 +926,7 @@
if ((RegionName != null) && !RegionName.Equals(""))
args["region_name"] = OSD.FromString(RegionName);
args["external_host_name"] = OSD.FromString(ExternalHostName);
+ args["external_ip_address"] = OSD.FromString(ExternalIPAddress); // by Fumi.Iseki for NAT
args["http_port"] = OSD.FromString(HttpPort.ToString());
args["server_uri"] = OSD.FromString(ServerURI);
args["region_xloc"] = OSD.FromString(RegionLocX.ToString());
@@ -883,6 +953,8 @@
RegionName = args["region_name"].AsString();
if (args["external_host_name"] != null)
ExternalHostName = args["external_host_name"].AsString();
+ if (args["external_ip_address"] != null) // by Fumi.Iseki for NAT
+ ExternalIPAddress = args["external_ip_address"].AsString();
if (args["http_port"] != null)
UInt32.TryParse(args["http_port"].AsString(), out m_httpPort);
if (args["server_uri"] != null)
@@ -922,11 +994,11 @@
m_regionType = args["region_type"].AsString();
}
- public static RegionInfo Create(UUID regionID, string regionName, uint regX, uint regY, string externalHostName, uint httpPort, uint simPort, uint remotingPort, string serverURI)
+ public static RegionInfo Create(UUID regionID, string regionName, uint regX, uint regY, string externalHostName, string externalIP, uint httpPort, uint simPort, uint remotingPort, string serverURI)
{
RegionInfo regionInfo;
IPEndPoint neighbourInternalEndPoint = new IPEndPoint(Util.GetHostFromDNS(externalHostName), (int)simPort);
- regionInfo = new RegionInfo(regX, regY, neighbourInternalEndPoint, externalHostName);
+ regionInfo = new RegionInfo(regX, regY, neighbourInternalEndPoint, externalHostName, externalIP);
regionInfo.RemotingPort = remotingPort;
regionInfo.RemotingAddress = externalHostName;
regionInfo.HttpPort = httpPort;
diff -Nur opensim-/OpenSim/Grid/GridServer.Modules/GridRestModule.cs opensim/OpenSim/Grid/GridServer.Modules/GridRestModule.cs
--- opensim-/OpenSim/Grid/GridServer.Modules/GridRestModule.cs 2010-01-10 23:43:49.000000000 +0900
+++ opensim/OpenSim/Grid/GridServer.Modules/GridRestModule.cs 2010-01-10 23:44:24.000000000 +0900
@@ -151,7 +151,7 @@
respstring += "";
respstring += "" + TheSim.UUID.ToString() + "";
respstring += "" + TheSim.regionName + "";
- respstring += "" + TheSim.serverIP + "";
+ respstring += "" + TheSim.serverIPadr + ""; // Fumi.Iseki serverIP -> serverIPadr
respstring += "" + TheSim.serverPort.ToString() + "";
respstring += "" + TheSim.regionLocX.ToString() + "";
respstring += "" + TheSim.regionLocY.ToString() + "";
@@ -230,7 +230,11 @@
break;
case "sim_ip":
- theSim.serverIP = simnode.ChildNodes[i].InnerText;
+ theSim.serverIPadr = simnode.ChildNodes[i].InnerText; // Fumi.Iseki
+ break;
+
+ case "sim_name":
+ theSim.serverName = simnode.ChildNodes[i].InnerText; // Fumi.Iseki
break;
case "sim_port":
@@ -249,19 +253,23 @@
}
}
- theSim.serverURI = "http://" + theSim.serverIP + ":" + theSim.serverPort + "/";
+ // by Fumi.Iseki for NAT
+ //theSim.serverURI = "http://" + theSim.serverIP + ":" + theSim.serverPort + "/";
+ theSim.serverURI = "http://" + theSim.serverName + ":" + theSim.serverPort + "/";
+
bool requirePublic = false;
bool requireValid = true;
if (requirePublic &&
- (theSim.serverIP.StartsWith("172.16") || theSim.serverIP.StartsWith("192.168") ||
- theSim.serverIP.StartsWith("10.") || theSim.serverIP.StartsWith("0.") ||
- theSim.serverIP.StartsWith("255.")))
+ (theSim.serverIPadr.StartsWith("172.16") || theSim.serverIPadr.StartsWith("192.168") ||
+ theSim.serverIPadr.StartsWith("10.") || theSim.serverIPadr.StartsWith("0.") ||
+ theSim.serverIPadr.StartsWith("255.")))
{
return "ERROR! Servers must register with public addresses.";
}
- if (requireValid && (theSim.serverIP.StartsWith("0.") || theSim.serverIP.StartsWith("255.")))
+ // by Fumi.Iseki for NAT
+ if (requireValid && (theSim.serverIPadr.StartsWith("0.") || theSim.serverIPadr.StartsWith("255.")))
{
return "ERROR! 0.*.*.* / 255.*.*.* Addresses are invalid, please check your server config and try again";
}
diff -Nur opensim-/OpenSim/Grid/GridServer.Modules/GridXmlRpcModule.cs opensim/OpenSim/Grid/GridServer.Modules/GridXmlRpcModule.cs
--- opensim-/OpenSim/Grid/GridServer.Modules/GridXmlRpcModule.cs 2010-01-10 23:43:49.000000000 +0900
+++ opensim/OpenSim/Grid/GridServer.Modules/GridXmlRpcModule.cs 2010-01-10 23:44:24.000000000 +0900
@@ -126,7 +126,9 @@
(uint)(central_region.regionLocY + y) * Constants.RegionSize));
response += "";
- response += "" + neighbour.serverIP + "";
+ // by Fumi.Iseki for NAT
+ response += "" + neighbour.serverName + "";
+ response += "" + neighbour.serverIPadr + "";
response += "" + neighbour.serverPort.ToString() + "";
response += "" + neighbour.regionLocX.ToString() + "";
response += "" + neighbour.regionLocY.ToString() + "";
@@ -376,7 +378,10 @@
responseData["estate_id"] = "1";
responseData["neighbours"] = SimNeighboursData;
- responseData["sim_ip"] = sim.serverIP;
+ // by Fumi.Iseki
+ responseData["sim_ip"] = sim.serverIPadr;
+ responseData["sim_name"] = sim.serverName;
+
responseData["sim_port"] = sim.serverPort.ToString();
responseData["asset_url"] = sim.regionAssetURI;
responseData["asset_sendkey"] = sim.regionAssetSendKey;
@@ -432,7 +437,10 @@
foreach (RegionProfileData aSim in neighbours)
{
NeighbourBlock = new Hashtable();
- NeighbourBlock["sim_ip"] = aSim.serverIP;
+ // Fumi.Iseki
+ NeighbourBlock["sim_ip"] = aSim.serverIPadr;
+ NeighbourBlock["sim_name"] = aSim.serverName;
+
NeighbourBlock["sim_port"] = aSim.serverPort.ToString();
NeighbourBlock["region_locx"] = aSim.regionLocX.ToString();
NeighbourBlock["region_locy"] = aSim.regionLocY.ToString();
@@ -462,7 +470,10 @@
(uint)(sim.regionLocY + y) * Constants.RegionSize));
NeighbourBlock = new Hashtable();
- NeighbourBlock["sim_ip"] = neighbour.serverIP;
+ // Fumi.Iseki
+ NeighbourBlock["sim_ip"] = neighbour.serverIPadr;
+ NeighbourBlock["sim_name"] = neighbour.serverName;
+
NeighbourBlock["sim_port"] = neighbour.serverPort.ToString();
NeighbourBlock["region_locx"] = neighbour.regionLocX.ToString();
NeighbourBlock["region_locy"] = neighbour.regionLocY.ToString();
@@ -515,7 +526,10 @@
sim.regionUserSendKey = m_config.UserSendKey;
sim.regionUserRecvKey = m_config.UserRecvKey;
- sim.serverIP = (string)requestData["sim_ip"];
+ // Fumi.Iseki
+ sim.serverIPadr = (string)requestData["sim_ip"];
+ sim.serverName = (string)requestData["sim_name"];
+
sim.serverPort = Convert.ToUInt32((string)requestData["sim_port"]);
sim.httpPort = Convert.ToUInt32((string)requestData["http_port"]);
sim.remotingPort = Convert.ToUInt32((string)requestData["remoting_port"]);
@@ -549,9 +563,11 @@
sim.regionHandle = Utils.UIntsToLong((sim.regionLocX * Constants.RegionSize), (sim.regionLocY * Constants.RegionSize));
sim.serverURI = (string)requestData["server_uri"];
- sim.httpServerURI = "http://" + sim.serverIP + ":" + sim.httpPort + "/";
+ //sim.httpServerURI = "http://" + sim.serverIP + ":" + sim.httpPort + "/";
+ sim.httpServerURI = "http://" + sim.serverName + ":" + sim.httpPort + "/";
- sim.regionName = (string)requestData["sim_name"];
+ //sim.regionName = (string)requestData["sim_name"];
+ sim.regionName = (string)requestData["regionname"];
try
@@ -680,7 +696,10 @@
{
m_log.Info("[DATA]: found " + (string)simData.regionName + " regionHandle = " +
(string)requestData["region_handle"]);
- responseData["sim_ip"] = simData.serverIP;
+ // Fumi.Iseki
+ responseData["sim_ip"] = simData.serverIPadr;
+ responseData["sim_name"] = simData.serverName;
+
responseData["sim_port"] = simData.serverPort.ToString();
responseData["server_uri"] = simData.serverURI;
responseData["http_port"] = simData.httpPort.ToString();
@@ -747,7 +766,10 @@
// For Sugilite compatibility
simProfileBlock["regionhandle"] = aSim.regionHandle.ToString();
- simProfileBlock["sim_ip"] = aSim.serverIP;
+ // Fumi.Iseki
+ simProfileBlock["sim_ip"] = aSim.serverIPadr;
+ simProfileBlock["sim_name"] = aSim.serverName;
+
simProfileBlock["sim_port"] = aSim.serverPort.ToString();
simProfileBlock["sim_uri"] = aSim.serverURI.ToString();
simProfileBlock["uuid"] = aSim.UUID.ToString();
@@ -782,7 +804,10 @@
// For Sugilite compatibility
simProfileBlock["regionhandle"] = simProfile.regionHandle.ToString();
- simProfileBlock["sim_ip"] = simProfile.serverIP.ToString();
+ // Fumi.Iseki
+ simProfileBlock["sim_ip"] = simProfile.serverIPadr.ToString();
+ simProfileBlock["sim_name"] = simProfile.serverName.ToString();
+
simProfileBlock["sim_port"] = simProfile.serverPort.ToString();
simProfileBlock["sim_uri"] = simProfile.serverURI.ToString();
simProfileBlock["uuid"] = simProfile.UUID.ToString();
@@ -839,7 +864,10 @@
responseData[prefix + "region_UUID"] = sim.UUID.ToString();
responseData[prefix + "region_locx"] = sim.regionLocX.ToString();
responseData[prefix + "region_locy"] = sim.regionLocY.ToString();
- responseData[prefix + "sim_ip"] = sim.serverIP.ToString();
+ // Fumi.Iseki
+ responseData[prefix + "sim_ip"] = sim.serverIPadr.ToString();
+ responseData[prefix + "sim_name"] = sim.serverName.ToString();
+
responseData[prefix + "sim_port"] = sim.serverPort.ToString();
responseData[prefix + "remoting_port"] = sim.remotingPort.ToString();
responseData[prefix + "http_port"] = sim.httpPort.ToString();
diff -Nur opensim-/OpenSim/Grid/MessagingServer.Modules/MessageRegionModule.cs opensim/OpenSim/Grid/MessagingServer.Modules/MessageRegionModule.cs
--- opensim-/OpenSim/Grid/MessagingServer.Modules/MessageRegionModule.cs 2010-01-10 23:43:49.000000000 +0900
+++ opensim/OpenSim/Grid/MessagingServer.Modules/MessageRegionModule.cs 2010-01-10 23:44:24.000000000 +0900
@@ -162,7 +162,10 @@
rprofile.regionLocY = (uint)(region.RegionLocY / Constants.RegionSize);
rprofile.RegionName = region.RegionName;
rprofile.ServerHttpPort = region.HttpPort;
- rprofile.ServerIP = region.ExternalHostName;
+ // Fumi.Iseki
+ rprofile.ServerIPadr = region.ExternalIPAddress;
+ rprofile.ServerName = region.ExternalHostName;
+
rprofile.ServerPort = (uint)region.ExternalEndPoint.Port;
rprofile.Uuid = region.RegionID;
return rprofile;
diff -Nur opensim-/OpenSim/Grid/UserServer.Modules/UserLoginService.cs opensim/OpenSim/Grid/UserServer.Modules/UserLoginService.cs
--- opensim-/OpenSim/Grid/UserServer.Modules/UserLoginService.cs 2010-01-10 23:43:49.000000000 +0900
+++ opensim/OpenSim/Grid/UserServer.Modules/UserLoginService.cs 2010-01-10 23:44:24.000000000 +0900
@@ -233,6 +233,7 @@
RegionInfo rinfo = new RegionInfo();
rinfo.ExternalHostName = gregion.ExternalHostName;
+ rinfo.ExternalIPAddress = gregion.ExternalIPAddress; // by Fumi.Iseki for NAT
rinfo.HttpPort = gregion.HttpPort;
rinfo.InternalEndPoint = gregion.InternalEndPoint;
rinfo.RegionID = gregion.RegionID;
@@ -262,7 +263,14 @@
{
try
{
- response.SimAddress = Util.GetHostFromURL(regionInfo.serverURI).ToString();
+ // by Fumi.Iseki
+ IPAddress simip = NetworkUtil.GetIPfromString(regionInfo.serverIPadr);
+ IPAddress ip = NetworkUtil.GetIPfromString(regionInfo.serverName);
+ if (ip!=null) simip = NetworkUtil.GetEffectiveIP(remoteClient.Address, ip, simip, null);
+
+ //response.SimAddress = Util.GetHostFromURL(regionInfo.serverURI).ToString();
+ response.SimAddress = simip.ToString();
+
response.SimPort = uint.Parse(regionInfo.serverURI.Split(new char[] { '/', ':' })[4]);
response.RegionX = regionInfo.regionLocX;
response.RegionY = regionInfo.regionLocY;
diff -Nur opensim-/OpenSim/Region/Framework/Scenes/Scene.cs opensim/OpenSim/Region/Framework/Scenes/Scene.cs
--- opensim-/OpenSim/Region/Framework/Scenes/Scene.cs 2010-01-10 23:43:49.000000000 +0900
+++ opensim/OpenSim/Region/Framework/Scenes/Scene.cs 2010-01-10 23:44:24.000000000 +0900
@@ -804,7 +804,8 @@
// Let the grid service module know, so this can be cached
m_eventManager.TriggerOnRegionUp(otherRegion);
- RegionInfo regInfo = new RegionInfo(xcell, ycell, otherRegion.InternalEndPoint, otherRegion.ExternalHostName);
+ // Fumi.Iseki for NAT
+ RegionInfo regInfo = new RegionInfo(xcell, ycell, otherRegion.InternalEndPoint, otherRegion.ExternalHostName, otherRegion.ExternalIPAddress);
regInfo.RegionID = otherRegion.RegionID;
regInfo.RegionName = otherRegion.RegionName;
regInfo.ScopeID = otherRegion.ScopeID;
diff -Nur opensim-/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs opensim/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
--- opensim-/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs 2010-01-10 23:43:49.000000000 +0900
+++ opensim/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs 2010-01-10 23:44:24.000000000 +0900
@@ -464,7 +464,15 @@
InformClientOfNeighbourDelegate d = InformClientOfNeighbourAsync;
try
{
- d.BeginInvoke(avatar, cagents[count], neighbour, neighbour.ExternalEndPoint, newAgent,
+ // Fumi.Iseki for NAT
+ IClientIPEndpoint ipepClient;
+ IPEndPoint endPoint = neighbour.InternalEndPoint;
+ if (avatar.ClientView.TryGet(out ipepClient))
+ {
+ endPoint = NetworkUtil.GetEffectiveIP(ipepClient.EndPoint, neighbour.InternalEndPoint, neighbour.ExternalEndPoint, m_regionInfo.ExternalEndPoint);
+ }
+ //d.BeginInvoke(avatar, cagents[count], neighbour, neighbour.ExternalEndPoint, newAgent,
+ d.BeginInvoke(avatar, cagents[count], neighbour, endPoint, newAgent,
InformClientOfNeighbourCompleted,
d);
}
@@ -513,7 +521,16 @@
agent.child = true;
InformClientOfNeighbourDelegate d = InformClientOfNeighbourAsync;
- d.BeginInvoke(avatar, agent, region, region.ExternalEndPoint, true,
+
+ // Fumi.Iseki for NAT
+ IClientIPEndpoint ipepClient;
+ IPEndPoint endPoint = region.InternalEndPoint;
+ if (avatar.ClientView.TryGet(out ipepClient))
+ {
+ endPoint = NetworkUtil.GetEffectiveIP(ipepClient.EndPoint, region.InternalEndPoint, region.ExternalEndPoint, m_regionInfo.ExternalEndPoint);
+ }
+ //d.BeginInvoke(avatar, agent, region, region.ExternalEndPoint, true,
+ d.BeginInvoke(avatar, agent, region, endPoint, true,
InformClientOfNeighbourCompleted,
d);
}
@@ -753,7 +770,16 @@
// Let's do DNS resolution only once in this process, please!
// This may be a costly operation. The reg.ExternalEndPoint field is not a passive field,
// it's actually doing a lot of work.
- IPEndPoint endPoint = reg.ExternalEndPoint;
+ //IPEndPoint endPoint = reg.ExternalEndPoint;
+
+ // Fumi.Iseki for NAT
+ IClientIPEndpoint ipClient;
+ IPEndPoint endPoint = reg.InternalEndPoint;
+ if (avatar.ClientView.TryGet(out ipClient))
+ {
+ endPoint = NetworkUtil.GetEffectiveIP(ipClient.EndPoint, reg.InternalEndPoint, reg.ExternalEndPoint, m_regionInfo.ExternalEndPoint);
+ }
+
if (endPoint.Address == null)
{
// Couldn't resolve the name. Can't TP, because the viewer wants IP addresses.
@@ -1358,15 +1384,28 @@
m_log.DebugFormat("[CAPS]: Sending new CAPS seed url {0} to client {1}", capsPath, agent.UUID);
+
+ // Fumi.Iseki for NAT
+ IClientIPEndpoint ipepClient;
+ IPEndPoint endPoint = neighbourRegion.InternalEndPoint;
+ if (agent.ClientView.TryGet(out ipepClient))
+ {
+ endPoint = NetworkUtil.GetEffectiveIP(ipepClient.EndPoint, neighbourRegion.InternalEndPoint, neighbourRegion.ExternalEndPoint, m_regionInfo.ExternalEndPoint);
+ }
+
IEventQueue eq = agent.Scene.RequestModuleInterface();
if (eq != null)
{
- eq.CrossRegion(neighbourHandle, pos, agent.Velocity, neighbourRegion.ExternalEndPoint,
+ // Fumi.Iseki for NAT
+ //eq.CrossRegion(neighbourHandle, pos, agent.Velocity, neighbourRegion.ExternalEndPoint,
+ eq.CrossRegion(neighbourHandle, pos, agent.Velocity, endPoint,
capsPath, agent.UUID, agent.ControllingClient.SessionId);
}
else
{
- agent.ControllingClient.CrossRegion(neighbourHandle, pos, agent.Velocity, neighbourRegion.ExternalEndPoint,
+ // Fumi.Iseki for NAT
+ //agent.ControllingClient.CrossRegion(neighbourHandle, pos, agent.Velocity, neighbourRegion.ExternalEndPoint,
+ agent.ControllingClient.CrossRegion(neighbourHandle, pos, agent.Velocity, endPoint,
capsPath);
}
diff -Nur opensim-/OpenSim/Region/Framework/Scenes/Tests/SceneTests.cs opensim/OpenSim/Region/Framework/Scenes/Tests/SceneTests.cs
--- opensim-/OpenSim/Region/Framework/Scenes/Tests/SceneTests.cs 2010-01-10 23:43:49.000000000 +0900
+++ opensim/OpenSim/Region/Framework/Scenes/Tests/SceneTests.cs 2010-01-10 23:44:24.000000000 +0900
@@ -129,7 +129,9 @@
[Test]
public void TestConstructor()
{
- RegionInfo regionInfo = new RegionInfo(0,0,null,null);
+ // Fumi.Iseki
+ //RegionInfo regionInfo = new RegionInfo(0,0,null,null);
+ RegionInfo regionInfo = new RegionInfo(0,0,null,null,null);
FakeStorageManager storageManager = new FakeStorageManager();
new Scene(regionInfo, null, null, null, storageManager, null, false, false, false, null, null);
diff -Nur opensim-/OpenSim/Services/Interfaces/IGridService.cs opensim/OpenSim/Services/Interfaces/IGridService.cs
--- opensim-/OpenSim/Services/Interfaces/IGridService.cs 2010-01-10 23:43:49.000000000 +0900
+++ opensim/OpenSim/Services/Interfaces/IGridService.cs 2010-01-10 23:44:24.000000000 +0900
@@ -123,6 +123,7 @@
protected string m_regionName = String.Empty;
protected string m_externalHostName;
+ protected string m_externalIPAddress; // by Fumi.Iseki
protected IPEndPoint m_internalEndPoint;
@@ -160,21 +161,25 @@
{
}
- public GridRegion(int regionLocX, int regionLocY, IPEndPoint internalEndPoint, string externalUri)
+ // by Fumi.Iseki
+ public GridRegion(int regionLocX, int regionLocY, IPEndPoint internalEndPoint, string externalUri, string externalIP)
{
m_regionLocX = regionLocX;
m_regionLocY = regionLocY;
m_internalEndPoint = internalEndPoint;
m_externalHostName = externalUri;
+ m_externalIPAddress = externalIP;
}
- public GridRegion(int regionLocX, int regionLocY, string externalUri, uint port)
+ // by Fumi.Iseki
+ public GridRegion(int regionLocX, int regionLocY, string externalUri, string externalIP, uint port)
{
m_regionLocX = regionLocX;
m_regionLocY = regionLocY;
m_externalHostName = externalUri;
+ m_externalIPAddress = externalIP;
m_internalEndPoint = new IPEndPoint(IPAddress.Parse("0.0.0.0"), (int)port);
}
@@ -192,6 +197,7 @@
m_regionLocY = (int)(ConvertFrom.RegionLocY * Constants.RegionSize);
m_internalEndPoint = ConvertFrom.InternalEndPoint;
m_externalHostName = ConvertFrom.ExternalHostName;
+ m_externalIPAddress = ConvertFrom.ExternalIPAddress; // Fumi.Iseki
m_httpPort = ConvertFrom.HttpPort;
RegionID = ConvertFrom.RegionID;
ServerURI = ConvertFrom.ServerURI;
@@ -215,6 +221,7 @@
m_regionLocY = ConvertFrom.RegionLocY;
m_internalEndPoint = ConvertFrom.InternalEndPoint;
m_externalHostName = ConvertFrom.ExternalHostName;
+ m_externalIPAddress = ConvertFrom.ExternalIPAddress; // Fumi.Iseki
m_httpPort = ConvertFrom.HttpPort;
RegionID = ConvertFrom.RegionID;
ServerURI = ConvertFrom.ServerURI;
@@ -234,13 +241,26 @@
{
get
{
+ // by Fumi.Iseki for NAT
+ if (m_externalIPAddress!=null && m_externalIPAddress!="0.0.0.0")
+ {
+ IPAddress ip = NetworkUtil.GetIPfromString(m_externalIPAddress);
+ return new IPEndPoint(ip, m_internalEndPoint.Port);
+ }
+
// Old one defaults to IPv6
//return new IPEndPoint(Dns.GetHostAddresses(m_externalHostName)[0], m_internalEndPoint.Port);
- IPAddress ia = null;
+ // by Fumi.Iseki for NAT
+ //IPAddress ia = null;
// If it is already an IP, don't resolve it - just return directly
- if (IPAddress.TryParse(m_externalHostName, out ia))
+ //if (IPAddress.TryParse(m_externalHostName, out ia))
+ IPAddress ia = NetworkUtil.GetIPfromString(m_externalHostName);
+ if (ia!=null)
+ {
+ m_externalIPAddress = ia.ToString();
return new IPEndPoint(ia, m_internalEndPoint.Port);
+ }
// Reset for next check
ia = null;
@@ -268,7 +288,17 @@
return new IPEndPoint(ia, m_internalEndPoint.Port);
}
- set { m_externalHostName = value.ToString(); }
+ set
+ {
+ m_externalHostName = value.ToString();
+
+ // by Fumi.Iseki for NAT
+ IPAddress ia = NetworkUtil.GetIPfromString(m_externalHostName);
+ if (ia!=null)
+ {
+ m_externalIPAddress = ia.ToString();
+ }
+ }
}
public string ExternalHostName
@@ -277,6 +307,13 @@
set { m_externalHostName = value; }
}
+ // by Fumi.Iseki for NAT
+ public string ExternalIPAddress
+ {
+ get { return m_externalIPAddress; }
+ set { m_externalIPAddress = value; }
+ }
+
public IPEndPoint InternalEndPoint
{
get { return m_internalEndPoint; }
@@ -300,7 +337,11 @@
kvp["locX"] = RegionLocX.ToString();
kvp["locY"] = RegionLocY.ToString();
kvp["regionName"] = RegionName;
- kvp["serverIP"] = ExternalHostName; //ExternalEndPoint.Address.ToString();
+ // Fumi.Iseki
+ //kvp["serverIP"] = ExternalHostName; //ExternalEndPoint.Address.ToString();
+ //kvp["serverName"] = ExternalHostName; //ExternalEndPoint.Address.ToString();
+ kvp["serverIP"] = ExternalIPAddress; //ExternalEndPoint.Address.ToString();
+
kvp["serverHttpPort"] = HttpPort.ToString();
kvp["serverURI"] = ServerURI;
kvp["serverPort"] = InternalEndPoint.Port.ToString();
@@ -326,15 +367,28 @@
if (kvp.ContainsKey("regionName"))
RegionName = (string)kvp["regionName"];
- if (kvp.ContainsKey("serverIP"))
+ // Fumi.Iseki
+ /*
+ if (kvp.ContainsKey("serverName"))
{
//int port = 0;
//Int32.TryParse((string)kvp["serverPort"], out port);
//IPEndPoint ep = new IPEndPoint(IPAddress.Parse((string)kvp["serverIP"]), port);
- ExternalHostName = (string)kvp["serverIP"];
+ ExternalHostName = (string)kvp["serverName"];
}
else
- ExternalHostName = "127.0.0.1";
+ //ExternalHostName = "127.0.0.1";
+ ExternalHostName = "localhost";
+ */
+
+ // Fumi.Iseki
+ if (kvp.ContainsKey("serverIP"))
+ {
+ ExternalIPAddress = (string)kvp["serverIP"];
+ }
+ else
+ ExternalIPAddress = "127.0.0.1";
+
if (kvp.ContainsKey("serverPort"))
{
@@ -350,8 +404,12 @@
HttpPort = port;
}
+ // Fumi.Iseki
if (kvp.ContainsKey("serverURI"))
+ {
ServerURI = (string)kvp["serverURI"];
+ ExternalHostName = ServerURI.Split(new char[] { '/', ':' })[3];
+ }
if (kvp.ContainsKey("regionMapTexture"))
UUID.TryParse((string)kvp["regionMapTexture"], out TerrainImage);
diff -Nur opensim-/OpenSim/Tests/Common/Setup/SceneSetupHelpers.cs opensim/OpenSim/Tests/Common/Setup/SceneSetupHelpers.cs
--- opensim-/OpenSim/Tests/Common/Setup/SceneSetupHelpers.cs 2010-01-10 23:43:49.000000000 +0900
+++ opensim/OpenSim/Tests/Common/Setup/SceneSetupHelpers.cs 2010-01-10 23:44:24.000000000 +0900
@@ -144,7 +144,10 @@
}
// We must set up a console otherwise setup of some modules may fail
- RegionInfo regInfo = new RegionInfo(x, y, new IPEndPoint(IPAddress.Loopback, 9000), "127.0.0.1");
+ //RegionInfo regInfo = new RegionInfo(x, y, new IPEndPoint(IPAddress.Loopback, 9000), "127.0.0.1");
+ // Fumi.Iseki
+ RegionInfo regInfo = new RegionInfo(x, y, new IPEndPoint(IPAddress.Loopback, 9000), "localhost", "127.0.0.1");
+
regInfo.RegionName = name;
regInfo.RegionID = id;