17 #if _RAKNET_SUPPORT_Router2==1 && _RAKNET_SUPPORT_UDPForwarder==1 
   29 using namespace SLNet;
 
   31 #ifndef INVALID_SOCKET 
   32 #define INVALID_SOCKET -1 
   61 #define MIN_MINIPUNCH_TIMEOUT   5000 
   68     printf(
"%s", message);
 
   72     printf(
"%s", message);
 
   75 enum Router2MessageIdentifiers
 
   77     ID_ROUTER_2_QUERY_FORWARDING,
 
   78     ID_ROUTER_2_REPLY_FORWARDING,
 
   79     ID_ROUTER_2_REQUEST_FORWARDING,
 
   80     ID_ROUTER_2_INCREASE_TIMEOUT,
 
  166     for (
unsigned int i=0; i < guids.
Size(); i++)
 
  168         ConnectionRequestSystem crs;
 
  169         if (guids[i]!=endpointGuid)
 
  172             crs.pingToEndpoint=-1;
 
  180             bsOut.
Write((
unsigned char) ID_ROUTER_2_QUERY_FORWARDING);
 
  181             bsOut.
Write(endpointGuid);
 
  197                     guids[i].g,endpointGuid.
g));
 
  224                 "(already connected to the %I64d)\n", __FILE__, __LINE__, endpointGuid.
g ));
 
  237     else if (max<=0 && maximumForwardingRequests>0)
 
  250     if (packet->
data[0]==ID_ROUTER_2_INTERNAL)
 
  252         switch (packet->
data[1])
 
  254         case ID_ROUTER_2_QUERY_FORWARDING:
 
  259         case ID_ROUTER_2_REPLY_FORWARDING:
 
  264         case ID_ROUTER_2_REQUEST_FORWARDING:
 
  273                         buff2,packet->
guid.
g));
 
  279         case ID_ROUTER_2_INCREASE_TIMEOUT:
 
  289         switch (packet->
data[1])
 
  301                         sa.
ToString(
false,buff2,static_cast<size_t>(32));
 
  327                         sa.
ToString(
false,buff2,static_cast<size_t>(32));
 
  329                                         "replying with ID_ROUTER_2_MINI_PUNCH_REPLY at %s:%i\n", sa.
GetPort(), buff2, __FILE__, __LINE__));
 
  354         unsigned int forwardingIndex;
 
  370             bsOut.
Write((
unsigned char) ID_ROUTER_2_INCREASE_TIMEOUT);
 
  377                     "sending ID_ROUTER_2_INCREASE_TIMEOUT to the %I64d at %s:%i\n", packet->
guid.
g, __FILE__, __LINE__));
 
  400     unsigned int connectionRequestIndex=0;
 
  408             connectionRequest->pingTimeout < curTime)
 
  410             bool anyRemoved=
false;
 
  411             unsigned int connectionRequestGuidIndex=0;
 
  412             connectionRequest->connectionRequestSystemsMutex.Lock();
 
  413             while (connectionRequestGuidIndex < connectionRequest->connectionRequestSystems.Size())
 
  415                 if (connectionRequest->connectionRequestSystems[connectionRequestGuidIndex].pingToEndpoint<0)
 
  418                     connectionRequest->connectionRequestSystems.
RemoveAtIndexFast(connectionRequestGuidIndex);
 
  422                     connectionRequestGuidIndex++;
 
  425             connectionRequest->connectionRequestSystemsMutex.Unlock();
 
  429                 if (connectionRequestIndex!=(
unsigned int)-1)
 
  438                         connectionRequestIndex++;
 
  443                     connectionRequestIndex++;
 
  448                 connectionRequestIndex++;
 
  453             connectionRequestIndex++;
 
  480     (void) lostConnectionReason;
 
  481     (void) systemAddress;
 
  484     unsigned int forwardedConnectionIndex=0;
 
  509             forwardedConnectionIndex++;
 
  521             forwardedConnectionIndex++;
 
  525     unsigned int connectionRequestIndex=0;
 
  530         cr->connectionRequestSystemsMutex.Lock();
 
  531         unsigned int connectionRequestGuidIndex = cr->GetGuidIndex(rakNetGUID);
 
  532         if (connectionRequestGuidIndex!=(
unsigned int)-1)
 
  535             cr->connectionRequestSystemsMutex.Unlock();
 
  566                 connectionRequestIndex++;
 
  571             cr->connectionRequestSystemsMutex.Unlock();
 
  572             connectionRequestIndex++;
 
  597     (void) failedConnectionAttemptReason;
 
  600     unsigned int forwardedConnectionIndex=0;
 
  617             forwardedConnectionIndex++;
 
  628     connectionRequest->connectionRequestSystemsMutex.Lock();
 
  632     if (connectionRequest->connectionRequestSystems.Size()==0)
 
  634         connectionRequest->connectionRequestSystemsMutex.Unlock();
 
  637         if (connectionRequest->returnConnectionLostOnFailure) {
 
  654         for (
unsigned int forwardedConnectionIndex=0; forwardedConnectionIndex < 
forwardedConnectionList.
Size(); forwardedConnectionIndex++)
 
  666     connectionRequest->connectionRequestSystemsMutex.Unlock();
 
  670         connectionRequest->connectionRequestSystemsMutex.Lock();
 
  672         for (
unsigned int i=0; i < connectionRequest->connectionRequestSystems.Size(); i++)
 
  674             if (connectionRequest->connectionRequestSystems[i].pingToEndpoint<0)
 
  676                 connectionRequest->connectionRequestSystemsMutex.Unlock();
 
  680         connectionRequest->connectionRequestSystemsMutex.Unlock();
 
  715     if (connectionRequest->GetGuidIndex(connectionRequest->lastRequestedForwardingSystem)!=(
unsigned int)-1)
 
  724     unsigned int connectionRequestGuidIndex;
 
  725     connectionRequest->connectionRequestSystemsMutex.Lock();
 
  726     for (connectionRequestGuidIndex=0; connectionRequestGuidIndex < connectionRequest->connectionRequestSystems.Size(); connectionRequestGuidIndex++)
 
  728         RakAssert(connectionRequest->connectionRequestSystems[connectionRequestGuidIndex].pingToEndpoint>=0);
 
  729         commandList.
Insert(connectionRequest->connectionRequestSystems[connectionRequestGuidIndex],
 
  730             connectionRequest->connectionRequestSystems[connectionRequestGuidIndex],
 
  734     connectionRequest->connectionRequestSystemsMutex.Unlock();
 
  736     connectionRequest->lastRequestedForwardingSystem=commandList[0].guid;
 
  740     bsOut.
Write((
unsigned char) ID_ROUTER_2_REQUEST_FORWARDING);
 
  741     bsOut.
Write(connectionRequest->endpointGuid);
 
  748             "(connectionRequest->lastRequestedForwardingSystem = %I64d, connectionRequest->endpointGuid = %I64d) at %s:%i\n", 
 
  749             connectionRequest->lastRequestedForwardingSystem.g,connectionRequest->endpointGuid.g, __FILE__, __LINE__));
 
  756     bsOut.
Write((
unsigned char) ID_ROUTER_2_REPLY_FORWARDING);
 
  757     bsOut.
Write(endpointGuid);
 
  768                    sourceGuid.
g, endpointGuid.
g,__FILE__, __LINE__));
 
  792     if (pingToEndpoint==-1)
 
  796             sourceGuid.
g, endpointGuid.
g,__FILE__, __LINE__));
 
  801     return pingToEndpoint;
 
  806     bs.IgnoreBytes(
sizeof(
MessageID) + 
sizeof(
unsigned char));
 
  809     bs.Read(endpointGuid);
 
  812     if (pingToEndpoint==-1)
 
  822     bsOut.
Write((
unsigned char) ID_ROUTER_2_REPLY_FORWARDING);
 
  823     bsOut.
Write(endpointGuid);
 
  825     bsOut.
Write((
unsigned short) pingToEndpoint);
 
  838     bs.IgnoreBytes(
sizeof(
MessageID) + 
sizeof(
unsigned char));
 
  840     bs.Read(endpointGuid);
 
  842     bool canForward=
false;
 
  848     if (connectionRequestIndex==(
unsigned int)-1)
 
  857     unsigned int connectionRequestGuidIndex = 
connectionRequests[connectionRequestIndex]->GetGuidIndex(packet->
guid);
 
  858     if (connectionRequestGuidIndex==(
unsigned int)-1)
 
  873             buff2, packet->
guid.
g, endpointGuid.
g, canForward, __FILE__, __LINE__));
 
  878         unsigned short pingToEndpoint;
 
  879         unsigned short usedEntries;
 
  880         bs.Read(pingToEndpoint);
 
  881         bs.Read(usedEntries);
 
  882         connectionRequests[connectionRequestIndex]->connectionRequestSystems[connectionRequestGuidIndex].usedForwardingEntries=usedEntries;
 
  900     bsOut.
Write(messageId);
 
  901     bsOut.
Write(endpointGuid);
 
  902     bsOut.
Write(sourceToDstPort);
 
  917     oobBs.
Write((
unsigned char)oob);
 
  921         oobBs.
Write(*extraData);
 
  923     char ipAddressString[32];
 
  924     sa.
ToString(
false, ipAddressString,static_cast<size_t>(32));
 
  931     bs.
Write((
unsigned char) oob);
 
  935     if (sa.
address.addr4.sin_family==AF_INET)
 
  941         #if RAKNET_SUPPORT_IPV6==1 
  999     bs.
Read(endpointGuid);
 
 1002     if (pingToEndpoint==-1)
 
 1006                 packet->
guid.
g, endpointGuid.
g, __FILE__, __LINE__));
 
 1010     unsigned short forwardingPort=0;
 
 1015         &forwardingPort, &forwardingSocket);
 
 1023                     "(packet->guid =%I64d, endpointGuid = %I64d) at %s:%i\n", 
 
 1024                 packet->
guid.
g, endpointGuid.
g,__FILE__, __LINE__));
 
 1035         endpointSystemAddress.
ToString(
true,buff3,static_cast<size_t>(64));
 
 1037             debugInterface->
ShowFailure(
FormatStringTS(buff,
"Router2 failed at %s:%i with UDPFORWARDER_NO_SOCKETS, packet->systemAddress=%s, endpointSystemAddress=%s, forwardingPort=%i, forwardingSocket=%i\n",
 
 1038             __FILE__, __LINE__, buff2, buff3, forwardingPort, forwardingSocket));
 
 1047         endpointSystemAddress.
ToString(
true,buff3,static_cast<size_t>(64));
 
 1049             debugInterface->
ShowFailure(
FormatStringTS(buff,
"Router2 failed at %s:%i with UDPFORWARDER_INVALID_PARAMETERS, packet->systemAddress=%s, endpointSystemAddress=%s, forwardingPort=%i, forwardingSocket=%i\n",
 
 1050             __FILE__, __LINE__, buff2, buff3, forwardingPort, forwardingSocket));
 
 1059         endpointSystemAddress.
ToString(
true,buff3,static_cast<size_t>(64));
 
 1061             debugInterface->
ShowFailure(
FormatStringTS(buff,
"Router2 failed at %s:%i with UDPFORWARDER_BIND_FAILED, packet->systemAddress=%s, endpointSystemAddress=%s, forwardingPort=%i, forwardingSocket=%i\n",
 
 1062             __FILE__, __LINE__, buff2, buff3, forwardingPort, forwardingSocket));
 
 1071             endpointSystemAddress.
ToString(
true,buff2,static_cast<size_t>(32));
 
 1075                 "endpointAddress=%s\nsourceAddress=%s\nforwardingPort=%i\n "                 
 1076                 "calling SendOOBMessages at %s:%i\n", buff2,buff3,forwardingPort,
_FILE_AND_LINE_));
 
 1080         MiniPunchRequest miniPunchRequest;
 
 1081         miniPunchRequest.endpointAddress=endpointSystemAddress;
 
 1082         miniPunchRequest.endpointGuid=endpointGuid;
 
 1083         miniPunchRequest.gotReplyFromEndpoint=
false;
 
 1084         miniPunchRequest.gotReplyFromSource=
false;
 
 1085         miniPunchRequest.sourceGuid=packet->
guid;
 
 1087         miniPunchRequest.forwardingPort=forwardingPort;
 
 1088         miniPunchRequest.forwardingSocket=forwardingSocket;
 
 1152     bs.
Read(routerGuid);
 
 1171     bs.
Read(endpointGuid);
 
 1172     unsigned short sourceToDestPort;
 
 1173     bs.
Read(sourceToDestPort);
 
 1180     unsigned int forwardingIndex;
 
 1195         ref_fc.intermediaryGuid         = packet->
guid;
 
 1203                 " Calling RakPeer::ChangeSystemAddress(%I64d, %s) at %s:%i\n",endpointGuid.
g, intermediaryAddress.
ToString(
true), __FILE__, __LINE__));
 
 1208         ForwardedConnection fc;
 
 1209         fc.endpointGuid=endpointGuid;
 
 1212         fc.intermediaryGuid=packet->
guid;
 
 1213         fc.weInitiatedForwarding=
false;
 
 1233     bs.
Read(endpointGuid);
 
 1234     unsigned short sourceToDestPort;
 
 1235     bs.
Read(sourceToDestPort);
 
 1237     unsigned int forwardingIndex;
 
 1256         ref_fc.intermediaryGuid         = packet->
guid;
 
 1275         ForwardedConnection fc;
 
 1278         fc.returnConnectionLostOnFailure=
connectionRequests[connectionRequestIndex]->returnConnectionLostOnFailure;
 
 1281         fc.endpointGuid=endpointGuid;
 
 1284         fc.intermediaryGuid=packet->
guid;
 
 1285         fc.weInitiatedForwarding=
true;
 
 1315             if (avePing>largestPing)
 
 1316                 largestPing=avePing;
 
 1330     return (
unsigned int) -1;
 
 1335     for (i=0; i < connectionRequestSystems.Size(); i++)
 
 1337         if (connectionRequestSystems[i].guid==guid)
 
 1340     return (
unsigned int) -1;
 
 1345     p->
data[0]=messageId;
 
 1348     p->
guid=endpointGuid;
 
 1373 #endif // _RAKNET_SUPPORT_*