Shadowrun: Awakened 29 September 2011 - Build 871
Router2.h
Go to the documentation of this file.
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.

GNU Lesser General Public License 3 Sourceforge.net