aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorJustin Clarke Casey2007-12-24 03:26:55 +0000
committerJustin Clarke Casey2007-12-24 03:26:55 +0000
commitbde1690c4c66c0022c968ff110dafa0b1cd351b4 (patch)
treee8318b17a49c7b7db618b96bd4b67b9fc253385e
parent* Patch from Alondria - Added LLFunctions llGetMass(), llGetLandOwnerAt(), ll... (diff)
downloadopensim-SC-bde1690c4c66c0022c968ff110dafa0b1cd351b4.zip
opensim-SC-bde1690c4c66c0022c968ff110dafa0b1cd351b4.tar.gz
opensim-SC-bde1690c4c66c0022c968ff110dafa0b1cd351b4.tar.bz2
opensim-SC-bde1690c4c66c0022c968ff110dafa0b1cd351b4.tar.xz
FOR http://opensimulator.org/mantis/view.php?id=226 I have a theory that an inventory descendents packet which exceeds a certain size is not being received by the client due
to something in the network constraining the maximum UDP packet size. This hypothesis fits the observed facts. The change here reduces the maximum number of items in any single packet to 20. If I'm wrong I'll go back and correct the comments.
-rw-r--r--OpenSim/Region/ClientStack/ClientView.cs44
1 files changed, 28 insertions, 16 deletions
diff --git a/OpenSim/Region/ClientStack/ClientView.cs b/OpenSim/Region/ClientStack/ClientView.cs
index 9e695ea..823214a 100644
--- a/OpenSim/Region/ClientStack/ClientView.cs
+++ b/OpenSim/Region/ClientStack/ClientView.cs
@@ -918,6 +918,18 @@ namespace OpenSim.Region.ClientStack
918 List<InventoryFolderBase> folders, 918 List<InventoryFolderBase> folders,
919 bool fetchFolders, bool fetchItems) 919 bool fetchFolders, bool fetchItems)
920 { 920 {
921 // An inventory descendents packet consists of a single agent section and an inventory details
922 // section for each inventory item. The size of each inventory item is approximately 550 bytes.
923 // In theory, UDP has a maximum packet size of 64k, so it should be possible to send descendent
924 // packets containing metadata for in excess of 100 items. But in practice, there may be other
925 // factors (e.g. firewalls) restraining the maximum UDP packet size. See,
926 //
927 // http://opensimulator.org/mantis/view.php?id=226
928 //
929 // for one example of this kind of thing. So we'll go for a cautious max
930 // items of 20 which gives a packet size of about 11k
931 int MAX_ITEMS_PER_PACKET = 20;
932
921 Encoding enc = Encoding.ASCII; 933 Encoding enc = Encoding.ASCII;
922 uint FULL_MASK_PERMISSIONS = 2147483647; 934 uint FULL_MASK_PERMISSIONS = 2147483647;
923 935
@@ -925,15 +937,15 @@ namespace OpenSim.Region.ClientStack
925 { 937 {
926 InventoryDescendentsPacket descend = CreateInventoryDescendentsPacket(ownerID, folderID); 938 InventoryDescendentsPacket descend = CreateInventoryDescendentsPacket(ownerID, folderID);
927 939
928 if (items.Count < 40) 940 if (items.Count < MAX_ITEMS_PER_PACKET)
929 { 941 {
930 descend.ItemData = new InventoryDescendentsPacket.ItemDataBlock[items.Count]; 942 descend.ItemData = new InventoryDescendentsPacket.ItemDataBlock[items.Count];
931 descend.AgentData.Descendents = items.Count; 943 descend.AgentData.Descendents = items.Count;
932 } 944 }
933 else 945 else
934 { 946 {
935 descend.ItemData = new InventoryDescendentsPacket.ItemDataBlock[40]; 947 descend.ItemData = new InventoryDescendentsPacket.ItemDataBlock[MAX_ITEMS_PER_PACKET];
936 descend.AgentData.Descendents = 40; 948 descend.AgentData.Descendents = MAX_ITEMS_PER_PACKET;
937 } 949 }
938 950
939 // Even if we aren't fetching the folders, we still need to include the folder count 951 // Even if we aren't fetching the folders, we still need to include the folder count
@@ -979,29 +991,29 @@ namespace OpenSim.Region.ClientStack
979 991
980 i++; 992 i++;
981 count++; 993 count++;
982 if (i == 40) 994 if (i == MAX_ITEMS_PER_PACKET)
983 { 995 {
984 OutPacket(descend, ThrottleOutPacketType.Asset); 996 OutPacket(descend, ThrottleOutPacketType.Asset);
985 997
986 if ((items.Count - count) > 0) 998 if ((items.Count - count) > 0)
987 { 999 {
988 descend = CreateInventoryDescendentsPacket(ownerID, folderID); 1000 descend = CreateInventoryDescendentsPacket(ownerID, folderID);
989 if ((items.Count - count) < 40) 1001 if ((items.Count - count) < MAX_ITEMS_PER_PACKET)
990 { 1002 {
991 descend.ItemData = new InventoryDescendentsPacket.ItemDataBlock[items.Count - count]; 1003 descend.ItemData = new InventoryDescendentsPacket.ItemDataBlock[items.Count - count];
992 descend.AgentData.Descendents = items.Count - count; 1004 descend.AgentData.Descendents = items.Count - count;
993 } 1005 }
994 else 1006 else
995 { 1007 {
996 descend.ItemData = new InventoryDescendentsPacket.ItemDataBlock[40]; 1008 descend.ItemData = new InventoryDescendentsPacket.ItemDataBlock[MAX_ITEMS_PER_PACKET];
997 descend.AgentData.Descendents = 40; 1009 descend.AgentData.Descendents = MAX_ITEMS_PER_PACKET;
998 } 1010 }
999 i = 0; 1011 i = 0;
1000 } 1012 }
1001 } 1013 }
1002 } 1014 }
1003 1015
1004 if (i < 40) 1016 if (i < MAX_ITEMS_PER_PACKET)
1005 { 1017 {
1006 OutPacket(descend, ThrottleOutPacketType.Asset); 1018 OutPacket(descend, ThrottleOutPacketType.Asset);
1007 } 1019 }
@@ -1012,15 +1024,15 @@ namespace OpenSim.Region.ClientStack
1012 { 1024 {
1013 InventoryDescendentsPacket descend = CreateInventoryDescendentsPacket(ownerID, folderID); 1025 InventoryDescendentsPacket descend = CreateInventoryDescendentsPacket(ownerID, folderID);
1014 1026
1015 if (folders.Count < 40) 1027 if (folders.Count < MAX_ITEMS_PER_PACKET)
1016 { 1028 {
1017 descend.FolderData = new InventoryDescendentsPacket.FolderDataBlock[folders.Count]; 1029 descend.FolderData = new InventoryDescendentsPacket.FolderDataBlock[folders.Count];
1018 descend.AgentData.Descendents = folders.Count; 1030 descend.AgentData.Descendents = folders.Count;
1019 } 1031 }
1020 else 1032 else
1021 { 1033 {
1022 descend.FolderData = new InventoryDescendentsPacket.FolderDataBlock[40]; 1034 descend.FolderData = new InventoryDescendentsPacket.FolderDataBlock[MAX_ITEMS_PER_PACKET];
1023 descend.AgentData.Descendents = 40; 1035 descend.AgentData.Descendents = MAX_ITEMS_PER_PACKET;
1024 } 1036 }
1025 1037
1026 // Not sure if this scenario ever actually occurs, but nonetheless we include the items 1038 // Not sure if this scenario ever actually occurs, but nonetheless we include the items
@@ -1042,29 +1054,29 @@ namespace OpenSim.Region.ClientStack
1042 1054
1043 i++; 1055 i++;
1044 count++; 1056 count++;
1045 if (i == 40) 1057 if (i == MAX_ITEMS_PER_PACKET)
1046 { 1058 {
1047 OutPacket(descend, ThrottleOutPacketType.Asset); 1059 OutPacket(descend, ThrottleOutPacketType.Asset);
1048 1060
1049 if ((folders.Count - count) > 0) 1061 if ((folders.Count - count) > 0)
1050 { 1062 {
1051 descend = CreateInventoryDescendentsPacket(ownerID, folderID); 1063 descend = CreateInventoryDescendentsPacket(ownerID, folderID);
1052 if ((folders.Count - count) < 40) 1064 if ((folders.Count - count) < MAX_ITEMS_PER_PACKET)
1053 { 1065 {
1054 descend.FolderData = new InventoryDescendentsPacket.FolderDataBlock[folders.Count - count]; 1066 descend.FolderData = new InventoryDescendentsPacket.FolderDataBlock[folders.Count - count];
1055 descend.AgentData.Descendents = folders.Count - count; 1067 descend.AgentData.Descendents = folders.Count - count;
1056 } 1068 }
1057 else 1069 else
1058 { 1070 {
1059 descend.FolderData = new InventoryDescendentsPacket.FolderDataBlock[40]; 1071 descend.FolderData = new InventoryDescendentsPacket.FolderDataBlock[MAX_ITEMS_PER_PACKET];
1060 descend.AgentData.Descendents = 40; 1072 descend.AgentData.Descendents = MAX_ITEMS_PER_PACKET;
1061 } 1073 }
1062 i = 0; 1074 i = 0;
1063 } 1075 }
1064 } 1076 }
1065 } 1077 }
1066 1078
1067 if (i < 40) 1079 if (i < MAX_ITEMS_PER_PACKET)
1068 { 1080 {
1069 OutPacket(descend, ThrottleOutPacketType.Asset); 1081 OutPacket(descend, ThrottleOutPacketType.Asset);
1070 } 1082 }