preliminary inter region communications (between regions in different instances) now works, so child agents and border crossings (and teleporting) now work.

The .net remoting is still very basic: we need security sinks added.
And we really need the OGS 2 protocol as soon as possible.
Sugilite
MW 2007-07-10 20:52:43 +00:00
parent ebdc64730a
commit f0ecc1de4c
5 changed files with 97 additions and 10 deletions

View File

@ -26,9 +26,11 @@
* *
*/ */
using libsecondlife; using libsecondlife;
using System;
namespace OpenSim.Framework.Types namespace OpenSim.Framework.Types
{ {
[Serializable]
public class AgentCircuitData public class AgentCircuitData
{ {
public AgentCircuitData() { } public AgentCircuitData() { }

View File

@ -130,6 +130,7 @@ namespace OpenSim.Framework.Types
m_remotingPort = value; m_remotingPort = value;
} }
} }
public string RemotingAddress;
public string DataStore = ""; public string DataStore = "";
public bool isSandbox = false; public bool isSandbox = false;

View File

@ -266,6 +266,7 @@ namespace OpenSim.Grid.GridServer
TheSim.regionLocX = Convert.ToUInt32((string)requestData["region_locx"]); TheSim.regionLocX = Convert.ToUInt32((string)requestData["region_locx"]);
TheSim.regionLocY = Convert.ToUInt32((string)requestData["region_locy"]); TheSim.regionLocY = Convert.ToUInt32((string)requestData["region_locy"]);
TheSim.regionLocZ = 0; TheSim.regionLocZ = 0;
TheSim.regionMapTextureID = new LLUUID((string)requestData["map-image-id"]);
TheSim.regionHandle = Helpers.UIntsToLong((TheSim.regionLocX * 256), (TheSim.regionLocY * 256)); TheSim.regionHandle = Helpers.UIntsToLong((TheSim.regionLocX * 256), (TheSim.regionLocY * 256));
System.Console.WriteLine("adding region " + TheSim.regionLocX + " , " + TheSim.regionLocY + " , " + TheSim.regionHandle); System.Console.WriteLine("adding region " + TheSim.regionLocX + " , " + TheSim.regionLocY + " , " + TheSim.regionHandle);
@ -392,16 +393,19 @@ namespace OpenSim.Grid.GridServer
} }
else if (requestData.ContainsKey("region_handle")) else if (requestData.ContainsKey("region_handle"))
{ {
Console.WriteLine("requesting data for region " + (string)requestData["region_handle"]);
simData = getRegion(Convert.ToUInt64((string)requestData["region_handle"])); simData = getRegion(Convert.ToUInt64((string)requestData["region_handle"]));
} }
if (simData == null) if (simData == null)
{ {
//Sim does not exist //Sim does not exist
Console.WriteLine("region not found");
responseData["error"] = "Sim does not exist"; responseData["error"] = "Sim does not exist";
} }
else else
{ {
Console.WriteLine("found region");
responseData["sim_ip"] = simData.serverIP; responseData["sim_ip"] = simData.serverIP;
responseData["sim_port"] = simData.serverPort.ToString(); responseData["sim_port"] = simData.serverPort.ToString();
responseData["http_port"] = simData.httpPort.ToString(); responseData["http_port"] = simData.httpPort.ToString();
@ -493,7 +497,7 @@ namespace OpenSim.Grid.GridServer
simProfileBlock["region-flags"] = 0; simProfileBlock["region-flags"] = 0;
simProfileBlock["water-height"] = 20; simProfileBlock["water-height"] = 20;
simProfileBlock["agents"] = 1; simProfileBlock["agents"] = 1;
simProfileBlock["map-image-id"] = simProfile.regionMapTextureID.ToString(); simProfileBlock["map-image-id"] = simProfile.regionMapTextureID.ToStringHyphenated();
// For Sugilite compatibility // For Sugilite compatibility
simProfileBlock["regionhandle"] = simProfile.regionHandle.ToString(); simProfileBlock["regionhandle"] = simProfile.regionHandle.ToString();

View File

@ -29,6 +29,7 @@ namespace OpenSim.Region.Communications.OGS1
serversInfo = servers_info; serversInfo = servers_info;
httpServer = httpServe; httpServer = httpServe;
httpServer.AddXmlRPCHandler("expect_user", this.ExpectUser); httpServer.AddXmlRPCHandler("expect_user", this.ExpectUser);
this.StartRemoting();
} }
public RegionCommsListener RegisterRegion(RegionInfo regionInfo) public RegionCommsListener RegisterRegion(RegionInfo regionInfo)
@ -52,6 +53,7 @@ namespace OpenSim.Region.Communications.OGS1
GridParams["sim_name"] = regionInfo.RegionName; GridParams["sim_name"] = regionInfo.RegionName;
GridParams["http_port"] = serversInfo.HttpListenerPort.ToString(); GridParams["http_port"] = serversInfo.HttpListenerPort.ToString();
GridParams["remoting_port"] = serversInfo.RemotingListenerPort.ToString(); GridParams["remoting_port"] = serversInfo.RemotingListenerPort.ToString();
GridParams["map-image-id"] = regionInfo.estateSettings.terrainImageID.ToStringHyphenated();
// Package into an XMLRPC Request // Package into an XMLRPC Request
ArrayList SendParams = new ArrayList(); ArrayList SendParams = new ArrayList();
@ -97,7 +99,7 @@ namespace OpenSim.Region.Communications.OGS1
public List<RegionInfo> RequestNeighbours(RegionInfo regionInfo) public List<RegionInfo> RequestNeighbours(RegionInfo regionInfo)
{ {
Hashtable respData = MapBlockQuery((int)regionInfo.RegionLocX - 1, (int)regionInfo.RegionLocY - 1, (int)regionInfo.RegionLocX + 1, (int)regionInfo.RegionLocY + 1); Hashtable respData = MapBlockQuery((int)regionInfo.RegionLocX - 1, (int)regionInfo.RegionLocY - 1, (int)regionInfo.RegionLocX + 1, (int)regionInfo.RegionLocY + 1);
List<RegionInfo> neighbours = new List<RegionInfo>(); List<RegionInfo> neighbours = new List<RegionInfo>();
@ -141,8 +143,40 @@ namespace OpenSim.Region.Communications.OGS1
return this.regions[regionHandle]; return this.regions[regionHandle];
} }
//TODO not a region in this instance so ask remote grid server //TODO not a region in this instance so ask remote grid server
MainLog.Instance.Warn("Unimplemented - RequestNeighbourInfo()");
return null; Hashtable requestData = new Hashtable();
requestData["region_handle"] = regionHandle.ToString();
requestData["authkey"] = this.serversInfo.GridSendKey;
ArrayList SendParams = new ArrayList();
SendParams.Add(requestData);
XmlRpcRequest GridReq = new XmlRpcRequest("simulator_data_request", SendParams);
XmlRpcResponse GridResp = GridReq.Send(this.serversInfo.GridURL, 3000);
Hashtable responseData = (Hashtable)GridResp.Value;
if (responseData.ContainsKey("error"))
{
Console.WriteLine("error received from grid server" + responseData["error"]);
return null;
}
uint regX = Convert.ToUInt32((string)responseData["region_locx"]);
uint regY = Convert.ToUInt32((string)responseData["region_locy"]);
string internalIpStr = (string)responseData["sim_ip"];
uint port = Convert.ToUInt32(responseData["sim_port"]);
string externalUri = (string)responseData["sim_uri"];
IPEndPoint neighbourInternalEndPoint = new IPEndPoint(IPAddress.Parse(internalIpStr), (int)port);
string neighbourExternalUri = externalUri;
RegionInfo regionInfo = new RegionInfo(regX, regY, neighbourInternalEndPoint, internalIpStr);
regionInfo.RemotingPort = Convert.ToUInt32((string)responseData["remoting_port"]);
regionInfo.RemotingAddress = internalIpStr;
regionInfo.SimUUID = new LLUUID((string)responseData["region_UUID"]);
regionInfo.RegionName = (string)responseData["region_name"];
return regionInfo;
} }
public List<MapBlockData> RequestNeighbourMapBlocks(int minX, int minY, int maxX, int maxY) public List<MapBlockData> RequestNeighbourMapBlocks(int minX, int minY, int maxX, int maxY)
@ -164,7 +198,7 @@ namespace OpenSim.Region.Communications.OGS1
neighbour.Access = Convert.ToByte(n["access"]); neighbour.Access = Convert.ToByte(n["access"]);
neighbour.RegionFlags = Convert.ToUInt32(n["region-flags"]); neighbour.RegionFlags = Convert.ToUInt32(n["region-flags"]);
neighbour.WaterHeight = Convert.ToByte(n["water-height"]); neighbour.WaterHeight = Convert.ToByte(n["water-height"]);
neighbour.MapImageId = (string)n["map-image-id"]; neighbour.MapImageId = new LLUUID((string)n["map-image-id"]);
neighbours.Add(neighbour); neighbours.Add(neighbour);
} }
@ -237,10 +271,10 @@ namespace OpenSim.Region.Communications.OGS1
#region InterRegion Comms #region InterRegion Comms
private void StartRemoting() private void StartRemoting()
{ {
TcpChannel ch = new TcpChannel(8895); TcpChannel ch = new TcpChannel(this.serversInfo.RemotingListenerPort);
ChannelServices.RegisterChannel(ch, true); ChannelServices.RegisterChannel(ch, true);
WellKnownServiceTypeEntry wellType = new WellKnownServiceTypeEntry(Type.GetType("OGS1InterRegionRemoting"), "InterRegions", WellKnownObjectMode.Singleton); WellKnownServiceTypeEntry wellType = new WellKnownServiceTypeEntry(typeof(OGS1InterRegionRemoting), "InterRegions", WellKnownObjectMode.Singleton);
RemotingConfiguration.RegisterWellKnownServiceType(wellType); RemotingConfiguration.RegisterWellKnownServiceType(wellType);
InterRegionSingleton.Instance.OnArrival += this.IncomingArrival; InterRegionSingleton.Instance.OnArrival += this.IncomingArrival;
InterRegionSingleton.Instance.OnChildAgent += this.IncomingChildAgent; InterRegionSingleton.Instance.OnChildAgent += this.IncomingChildAgent;
@ -254,9 +288,31 @@ namespace OpenSim.Region.Communications.OGS1
this.listeners[regionHandle].TriggerExpectUser(regionHandle, agentData); this.listeners[regionHandle].TriggerExpectUser(regionHandle, agentData);
return true; return true;
} }
//TODO need to see if we know about where this region is and use .net remoting RegionInfo regInfo = this.RequestNeighbourInfo(regionHandle);
// to inform it. if (regInfo != null)
Console.WriteLine("Inform remote region of child agent not implemented yet"); {
//don't want to be creating a new link to the remote instance every time like we are here
bool retValue = false;
OGS1InterRegionRemoting remObject = (OGS1InterRegionRemoting)Activator.GetObject(
typeof(OGS1InterRegionRemoting),
"tcp://"+ regInfo.RemotingAddress+":"+regInfo.RemotingPort+"/InterRegions");
if (remObject != null)
{
retValue = remObject.InformRegionOfChildAgent(regionHandle, agentData);
}
else
{
Console.WriteLine("remoting object not found");
}
remObject = null;
return retValue;
}
return false; return false;
} }
@ -267,6 +323,29 @@ namespace OpenSim.Region.Communications.OGS1
this.listeners[regionHandle].TriggerExpectAvatarCrossing(regionHandle, agentID, position); this.listeners[regionHandle].TriggerExpectAvatarCrossing(regionHandle, agentID, position);
return true; return true;
} }
RegionInfo regInfo = this.RequestNeighbourInfo(regionHandle);
if (regInfo != null)
{
bool retValue = false;
OGS1InterRegionRemoting remObject = (OGS1InterRegionRemoting)Activator.GetObject(
typeof(OGS1InterRegionRemoting),
"tcp://" + regInfo.RemotingAddress + ":" + regInfo.RemotingPort + "/InterRegions");
if (remObject != null)
{
retValue = remObject.ExpectAvatarCrossing(regionHandle, agentID, position);
}
else
{
Console.WriteLine("remoting object not found");
}
remObject = null;
return retValue;
}
//TODO need to see if we know about where this region is and use .net remoting //TODO need to see if we know about where this region is and use .net remoting
// to inform it. // to inform it.
return false; return false;

View File

@ -269,6 +269,7 @@ namespace OpenSim.Region.GridInterfaces.Local
} }
catch (Exception e) catch (Exception e)
{ {
Console.WriteLine("exception loading default assets into database");
Console.WriteLine(e.Message); Console.WriteLine(e.Message);
} }