llcircuit.h
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:11k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llcircuit.h
  3.  * @brief Provides a method for tracking network circuit information
  4.  * for the UDP message system
  5.  *
  6.  * $LicenseInfo:firstyear=2001&license=viewergpl$
  7.  * 
  8.  * Copyright (c) 2001-2010, Linden Research, Inc.
  9.  * 
  10.  * Second Life Viewer Source Code
  11.  * The source code in this file ("Source Code") is provided by Linden Lab
  12.  * to you under the terms of the GNU General Public License, version 2.0
  13.  * ("GPL"), unless you have obtained a separate licensing agreement
  14.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  15.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  16.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  17.  * 
  18.  * There are special exceptions to the terms and conditions of the GPL as
  19.  * it is applied to this Source Code. View the full text of the exception
  20.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  21.  * online at
  22.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  23.  * 
  24.  * By copying, modifying or distributing this software, you acknowledge
  25.  * that you have read and understood your obligations described above,
  26.  * and agree to abide by those obligations.
  27.  * 
  28.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  29.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  30.  * COMPLETENESS OR PERFORMANCE.
  31.  * $/LicenseInfo$
  32.  */
  33. #ifndef LL_LLCIRCUIT_H
  34. #define LL_LLCIRCUIT_H
  35. #include <map>
  36. #include <vector>
  37. #include "llerror.h"
  38. #include "lltimer.h"
  39. #include "timing.h"
  40. #include "net.h"
  41. #include "llhost.h"
  42. #include "llpacketack.h"
  43. #include "lluuid.h"
  44. #include "llthrottle.h"
  45. #include "llstat.h"
  46. //
  47. // Constants
  48. //
  49. const F32 LL_AVERAGED_PING_ALPHA = 0.2f;  // relaxation constant on ping running average
  50. const F32 LL_AVERAGED_PING_MAX = 2000;    // msec
  51. const F32 LL_AVERAGED_PING_MIN =  100;    // msec  // IW: increased to avoid retransmits when a process is slow
  52. const U32 INITIAL_PING_VALUE_MSEC = 1000; // initial value for the ping delay, or for ping delay for an unknown circuit
  53. const TPACKETID LL_MAX_OUT_PACKET_ID = 0x01000000;
  54. // 0 - flags
  55. // [1,4] - packetid
  56. // 5 - data offset (after message name)
  57. const U8 LL_PACKET_ID_SIZE = 6;
  58. const S32 LL_MAX_RESENT_PACKETS_PER_FRAME = 100;
  59. const S32 LL_MAX_ACKED_PACKETS_PER_FRAME = 200;
  60. //
  61. // Prototypes and Predefines
  62. //
  63. class LLMessageSystem;
  64. class LLEncodedDatagramService;
  65. class LLSD;
  66. //
  67. // Classes
  68. //
  69. class LLCircuitData
  70. {
  71. public:
  72. LLCircuitData(const LLHost &host, TPACKETID in_id, 
  73.   const F32 circuit_heartbeat_interval, const F32 circuit_timeout);
  74. ~LLCircuitData();
  75. S32 resendUnackedPackets(const F64 now);
  76. void clearDuplicateList(TPACKETID oldest_id);
  77. void dumpResendCountAndReset(); // Used for tracking how many resends are being done on a circuit.
  78. // Public because stupid message system callbacks uses it.
  79. void pingTimerStart();
  80. void pingTimerStop(const U8 ping_id);
  81. void ackReliablePacket(TPACKETID packet_num);
  82. // remote computer information
  83. const LLUUID& getRemoteID() const { return mRemoteID; }
  84. const LLUUID& getRemoteSessionID() const { return mRemoteSessionID; }
  85. void setRemoteID(const LLUUID& id) { mRemoteID = id; }
  86. void setRemoteSessionID(const LLUUID& id) { mRemoteSessionID = id; }
  87. void setTrusted(BOOL t);
  88. // The local end point ID is used when establishing a trusted circuit.
  89. // no matching set function for getLocalEndPointID()
  90. // mLocalEndPointID should only ever be setup in the LLCircuitData constructor
  91. const LLUUID& getLocalEndPointID() const { return mLocalEndPointID; }
  92. U32 getPingDelay() const;
  93. S32 getPingsInTransit() const { return mPingsInTransit; }
  94. // ACCESSORS
  95. BOOL isAlive() const;
  96. BOOL isBlocked() const;
  97. BOOL getAllowTimeout() const;
  98. F32 getPingDelayAveraged();
  99. F32 getPingInTransitTime();
  100. U32 getPacketsIn() const;
  101. S32 getBytesIn() const;
  102. S32 getBytesOut() const;
  103. U32 getPacketsOut() const;
  104. U32 getPacketsLost() const;
  105. TPACKETID getPacketOutID() const;
  106. BOOL getTrusted() const;
  107. F32 getAgeInSeconds() const;
  108. S32 getUnackedPacketCount() const { return mUnackedPacketCount; }
  109. S32 getUnackedPacketBytes() const { return mUnackedPacketBytes; }
  110. F64         getNextPingSendTime() const { return mNextPingSendTime; }
  111.     F32         getOutOfOrderRate(LLStatAccum::TimeScale scale = LLStatAccum::SCALE_MINUTE) 
  112.                     { return mOutOfOrderRate.meanValue(scale); }
  113.     U32         getLastPacketGap() const { return mLastPacketGap; }
  114.     LLHost      getHost() const { return mHost; }
  115. LLThrottleGroup &getThrottleGroup() { return mThrottles; }
  116. class less
  117. {
  118. public:
  119. bool operator()(const LLCircuitData* lhs, const LLCircuitData* rhs) const
  120. {
  121. if (lhs->getNextPingSendTime() < rhs->getNextPingSendTime())
  122. {
  123. return true;
  124. }
  125. else if (lhs->getNextPingSendTime() > rhs->getNextPingSendTime())
  126. {
  127. return false;
  128. }
  129. else return lhs > rhs;
  130. }
  131. };
  132. //
  133. // Debugging stuff (not necessary for operation)
  134. //
  135. void checkPeriodTime(); // Reset per-period counters if necessary.
  136. friend std::ostream& operator<<(std::ostream& s, LLCircuitData &circuit);
  137. void getInfo(LLSD& info) const;
  138. friend class LLCircuit;
  139. friend class LLMessageSystem;
  140. friend class LLEncodedDatagramService;
  141. friend void crash_on_spaceserver_timeout (const LLHost &host, void *); // HACK, so it has access to setAlive() so it can send a final shutdown message.
  142. protected:
  143. TPACKETID nextPacketOutID();
  144. void setPacketInID(TPACKETID id);
  145. void checkPacketInID(TPACKETID id, BOOL receive_resent);
  146. void setPingDelay(U32 ping);
  147. BOOL checkCircuitTimeout(); // Return FALSE if the circuit is dead and should be cleaned up
  148. void addBytesIn(S32 bytes);
  149. void addBytesOut(S32 bytes);
  150. U8 nextPingID() { mLastPingID++; return mLastPingID; }
  151. BOOL updateWatchDogTimers(LLMessageSystem *msgsys); // Return FALSE if the circuit is dead and should be cleaned up
  152. void addReliablePacket(S32 mSocket, U8 *buf_ptr, S32 buf_len, LLReliablePacketParams *params);
  153. BOOL isDuplicateResend(TPACKETID packetnum);
  154. // Call this method when a reliable message comes in - this will
  155. // correctly place the packet in the correct list to be acked
  156. // later. RAack = requested ack
  157. BOOL collectRAck(TPACKETID packet_num);
  158. void setTimeoutCallback(void (*callback_func)(const LLHost &host, void *user_data), void *user_data);
  159. void setAlive(BOOL b_alive);
  160. void setAllowTimeout(BOOL allow);
  161. protected:
  162. // Identification for this circuit.
  163. LLHost mHost;
  164. LLUUID mRemoteID;
  165. LLUUID mRemoteSessionID;
  166. LLThrottleGroup mThrottles;
  167. TPACKETID mWrapID;
  168. // Current packet IDs of incoming/outgoing packets
  169. // Used for packet sequencing/packet loss detection.
  170. TPACKETID mPacketsOutID;
  171. TPACKETID mPacketsInID;
  172. TPACKETID mHighestPacketID;
  173. // Callback and data to run in the case of a circuit timeout.
  174. // Used primarily to try and reconnect to servers if they crash/die.
  175. void (*mTimeoutCallback)(const LLHost &host, void *user_data);
  176. void *mTimeoutUserData;
  177. BOOL mTrusted; // Is this circuit trusted?
  178. BOOL mbAllowTimeout; // Machines can "pause" circuits, forcing them not to be dropped
  179. BOOL mbAlive; // Indicates whether a circuit is "alive", i.e. responded to pings
  180. BOOL mBlocked; // Blocked is true if the circuit is hosed, i.e. far behind on pings
  181. // Not sure what the difference between this and mLastPingSendTime is
  182. F64 mPingTime; // Time at which a ping was sent.
  183. F64 mLastPingSendTime; // Time we last sent a ping
  184. F64 mLastPingReceivedTime; // Time we last received a ping
  185. F64     mNextPingSendTime;          // Time to try and send the next ping
  186. S32 mPingsInTransit; // Number of pings in transit
  187. U8 mLastPingID; // ID of the last ping that we sent out
  188. // Used for determining the resend time for reliable resends.
  189. U32 mPingDelay;             // raw ping delay
  190. F32 mPingDelayAveraged;     // averaged ping delay (fast attack/slow decay)
  191. typedef std::map<TPACKETID, U64> packet_time_map;
  192. packet_time_map mPotentialLostPackets;
  193. packet_time_map mRecentlyReceivedReliablePackets;
  194. std::vector<TPACKETID> mAcks;
  195. typedef std::map<TPACKETID, LLReliablePacket *> reliable_map;
  196. typedef reliable_map::iterator reliable_iter;
  197. reliable_map mUnackedPackets;
  198. reliable_map mFinalRetryPackets;
  199. S32 mUnackedPacketCount;
  200. S32 mUnackedPacketBytes;
  201. LLUUID mLocalEndPointID;
  202. //
  203. // These variables are being used for statistical and debugging purpose ONLY,
  204. // as far as I can tell.
  205. //
  206. U32 mPacketsOut;
  207. U32 mPacketsIn;
  208. S32 mPacketsLost;
  209. S32 mBytesIn;
  210. S32 mBytesOut;
  211. F32 mLastPeriodLength; // seconds
  212. S32 mBytesInLastPeriod;
  213. S32 mBytesOutLastPeriod;
  214. S32 mBytesInThisPeriod;
  215. S32 mBytesOutThisPeriod;
  216. F32 mPeakBPSIn; // bits per second, max of all period bps
  217. F32 mPeakBPSOut; // bits per second, max of all period bps
  218. F64 mPeriodTime;
  219. LLTimer mExistenceTimer;     // initialized when circuit created, used to track bandwidth numbers
  220. S32 mCurrentResendCount; // Number of resent packets since last spam
  221.     LLStatRate  mOutOfOrderRate;    // Rate of out of order packets coming in.
  222.     U32     mLastPacketGap;         // Gap in sequence number of last packet.
  223. const F32 mHeartbeatInterval;
  224. const F32 mHeartbeatTimeout;
  225. };
  226. // Actually a singleton class -- the global messagesystem
  227. // has a single LLCircuit member.
  228. class LLCircuit
  229. {
  230. public:
  231. // CREATORS
  232. LLCircuit(const F32 circuit_heartbeat_interval, const F32 circuit_timeout);
  233. ~LLCircuit();
  234. // ACCESSORS
  235. LLCircuitData* findCircuit(const LLHost& host) const;
  236. BOOL isCircuitAlive(const LLHost& host) const;
  237. // MANIPULATORS
  238. LLCircuitData *addCircuitData(const LLHost &host, TPACKETID in_id);
  239. void removeCircuitData(const LLHost &host);
  240. void     updateWatchDogTimers(LLMessageSystem *msgsys);
  241. void resendUnackedPackets(S32& unacked_list_length, S32& unacked_list_size);
  242. // this method is called during the message system processAcks()
  243. // to send out any acks that did not get sent already. 
  244. void sendAcks();
  245. friend std::ostream& operator<<(std::ostream& s, LLCircuit &circuit);
  246. void getInfo(LLSD& info) const;
  247. void dumpResends();
  248. typedef std::map<LLHost, LLCircuitData*> circuit_data_map;
  249. /**
  250.  * @brief This method gets an iterator range starting after key in
  251.  * the circuit data map.
  252.  *
  253.  * @param key The the host before first.
  254.  * @param first[out] The first matching value after key. This
  255.  * value will equal end if there are no entries.
  256.  * @param end[out] The end of the iteration sequence.
  257.  */
  258. void getCircuitRange(
  259. const LLHost& key,
  260. circuit_data_map::iterator& first,
  261. circuit_data_map::iterator& end);
  262. // Lists that optimize how many circuits we need to traverse a frame
  263. // HACK - this should become protected eventually, but stupid !@$@# message system/circuit classes are jumbling things up.
  264. circuit_data_map mUnackedCircuitMap; // Map of circuits with unacked data
  265. circuit_data_map mSendAckMap; // Map of circuits which need to send acks
  266. protected:
  267. circuit_data_map mCircuitData;
  268. typedef std::set<LLCircuitData *, LLCircuitData::less> ping_set_t; // Circuits sorted by next ping time
  269. ping_set_t mPingSet;
  270. // This variable points to the last circuit data we found to
  271. // optimize the many, many times we call findCircuit. This may be
  272. // set in otherwise const methods, so it is declared mutable.
  273. mutable LLCircuitData* mLastCircuit;
  274. private:
  275. const F32 mHeartbeatInterval;
  276. const F32 mHeartbeatTimeout;
  277. };
  278. #endif