diff options
author | Justin Clarke Casey | 2007-12-24 03:26:55 +0000 |
---|---|---|
committer | Justin Clarke Casey | 2007-12-24 03:26:55 +0000 |
commit | bde1690c4c66c0022c968ff110dafa0b1cd351b4 (patch) | |
tree | e8318b17a49c7b7db618b96bd4b67b9fc253385e /OpenSim/Region/ClientStack/ClientView.cs | |
parent | * Patch from Alondria - Added LLFunctions llGetMass(), llGetLandOwnerAt(), ll... (diff) | |
download | opensim-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.
Diffstat (limited to 'OpenSim/Region/ClientStack/ClientView.cs')
-rw-r--r-- | OpenSim/Region/ClientStack/ClientView.cs | 44 |
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 | } |