![]() |
Shadowrun: Awakened 29 September 2011 - Build 871
|
00001 00002 00003 00004 00005 00006 00007 00008 #include "NativeFeatureIncludes.h" 00009 #if _RAKNET_SUPPORT_Router2==1 && _RAKNET_SUPPORT_UDPForwarder==1 00010 00011 #ifndef __ROUTER_2_PLUGIN_H 00012 #define __ROUTER_2_PLUGIN_H 00013 00014 #include "RakNetTypes.h" 00015 #include "PluginInterface2.h" 00016 #include "PacketPriority.h" 00017 #include "Export.h" 00018 #include "UDPForwarder.h" 00019 #include "MessageIdentifiers.h" 00020 #include "DS_List.h" 00021 #include "SimpleMutex.h" 00022 00023 namespace RakNet 00024 { 00026 class RakPeerInterface; 00027 00028 struct Router2DebugInterface 00029 { 00030 Router2DebugInterface() {} 00031 virtual ~Router2DebugInterface() {} 00032 virtual void ShowFailure(const char *message); 00033 virtual void ShowDiagnostic(const char *message); 00034 }; 00035 00042 00046 class RAK_DLL_EXPORT Router2 : public PluginInterface2 00047 { 00048 public: 00049 // GetInstance() and DestroyInstance(instance*) 00050 STATIC_FACTORY_DECLARATIONS(Router2) 00051 00052 Router2(); 00053 virtual ~Router2(); 00054 00057 void SetSocketFamily(unsigned short _socketFamily); 00058 00077 void EstablishRouting(RakNetGUID endpointGuid); 00078 00081 void SetMaximumForwardingRequests(int max); 00082 00084 void SetDebugInterface(Router2DebugInterface *_debugInterface); 00085 00087 Router2DebugInterface *GetDebugInterface(void) const; 00088 00089 // -------------------------------------------------------------------------------------------- 00090 // Packet handling functions 00091 // -------------------------------------------------------------------------------------------- 00092 virtual PluginReceiveResult OnReceive(Packet *packet); 00093 virtual void Update(void); 00094 virtual void OnClosedConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, PI2_LostConnectionReason lostConnectionReason ); 00095 virtual void OnFailedConnectionAttempt(Packet *packet, PI2_FailedConnectionAttemptReason failedConnectionAttemptReason); 00096 virtual void OnRakPeerShutdown(void); 00097 00098 00099 enum Router2RequestStates 00100 { 00101 R2RS_REQUEST_STATE_QUERY_FORWARDING, 00102 REQUEST_STATE_REQUEST_FORWARDING, 00103 }; 00104 00105 struct ConnectionRequestSystem 00106 { 00107 RakNetGUID guid; 00108 int pingToEndpoint; 00109 unsigned short usedForwardingEntries; 00110 }; 00111 00112 struct ConnnectRequest 00113 { 00114 ConnnectRequest(); 00115 ~ConnnectRequest(); 00116 00117 DataStructures::List<ConnectionRequestSystem> connectionRequestSystems; 00118 SimpleMutex connectionRequestSystemsMutex; 00119 Router2RequestStates requestState; 00120 RakNet::TimeMS pingTimeout; 00121 RakNetGUID endpointGuid; 00122 RakNetGUID lastRequestedForwardingSystem; 00123 bool returnConnectionLostOnFailure; 00124 unsigned int GetGuidIndex(RakNetGUID guid); 00125 }; 00126 00127 unsigned int GetConnectionRequestIndex(RakNetGUID endpointGuid); 00128 00129 struct MiniPunchRequest 00130 { 00131 RakNetGUID endpointGuid; 00132 SystemAddress endpointAddress; 00133 bool gotReplyFromEndpoint; 00134 RakNetGUID sourceGuid; 00135 SystemAddress sourceAddress; 00136 bool gotReplyFromSource; 00137 RakNet::TimeMS timeout; 00138 RakNet::TimeMS nextAction; 00139 unsigned short forwardingPort; 00140 SOCKET forwardingSocket; 00141 }; 00142 00143 struct ForwardedConnection 00144 { 00145 RakNetGUID endpointGuid; 00146 RakNetGUID intermediaryGuid; 00147 SystemAddress intermediaryAddress; 00148 bool returnConnectionLostOnFailure; 00149 bool weInitiatedForwarding; 00150 }; 00151 00152 protected: 00153 00154 bool UpdateForwarding(ConnnectRequest* connectionRequest); 00155 void RemoveConnectionRequest(unsigned int connectionRequestIndex); 00156 void RequestForwarding(ConnnectRequest* connectionRequest); 00157 void OnQueryForwarding(Packet *packet); 00158 void OnQueryForwardingReply(Packet *packet); 00159 void OnRequestForwarding(Packet *packet); 00160 void OnRerouted(Packet *packet); 00161 void OnMiniPunchReply(Packet *packet); 00162 void OnMiniPunchReplyBounce(Packet *packet); 00163 bool OnForwardingSuccess(Packet *packet); 00164 int GetLargestPingAmongConnectedSystems(void) const; 00165 void ReturnToUser(MessageID messageId, RakNetGUID endpointGuid, const SystemAddress &systemAddress, bool wasGeneratedLocally); 00166 bool ConnectInternal(RakNetGUID endpointGuid, bool returnConnectionLostOnFailure); 00167 00168 UDPForwarder *udpForwarder; 00169 int maximumForwardingRequests; 00170 SimpleMutex connectionRequestsMutex, miniPunchesInProgressMutex, forwardedConnectionListMutex; 00171 DataStructures::List<ConnnectRequest*> connectionRequests; 00172 DataStructures::List<MiniPunchRequest> miniPunchesInProgress; 00173 // Forwarding we have initiated 00174 DataStructures::List<ForwardedConnection> forwardedConnectionList; 00175 00176 void ClearConnectionRequests(void); 00177 void ClearMinipunches(void); 00178 void ClearForwardedConnections(void); 00179 void ClearAll(void); 00180 int ReturnFailureOnCannotForward(RakNetGUID sourceGuid, RakNetGUID endpointGuid); 00181 void SendFailureOnCannotForward(RakNetGUID sourceGuid, RakNetGUID endpointGuid); 00182 void SendForwardingSuccess(MessageID messageId, RakNetGUID sourceGuid, RakNetGUID endpointGuid, unsigned short sourceToDstPort); 00183 void SendOOBFromRakNetPort(OutOfBandIdentifiers oob, BitStream *extraData, SystemAddress sa); 00184 void SendOOBFromSpecifiedSocket(OutOfBandIdentifiers oob, SystemAddress sa, SOCKET socket); 00185 void SendOOBMessages(MiniPunchRequest *mpr); 00186 00187 Router2DebugInterface *debugInterface; 00188 unsigned short socketFamily; 00189 }; 00190 00191 } 00192 00193 #endif 00194 00195 #endif // _RAKNET_SUPPORT_*
Copyright © 2007-2010 by The Shadowrun: Awakened Team. This work is licensed under the GNU Lesser General Public License 3.