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_*