mirror of
https://git.do.srb2.org/KartKrew/Kart-Public.git
synced 2024-12-31 23:00:57 +00:00
Try to fix hangs caused by PT_CLIENTJOIN with a non-zero ack
This commit is contained in:
parent
9bc3acd17a
commit
0911ec79d1
1 changed files with 33 additions and 16 deletions
49
src/d_net.c
49
src/d_net.c
|
@ -363,7 +363,11 @@ static boolean Processackpak(void)
|
||||||
{
|
{
|
||||||
UINT8 ack = netbuffer->ack;
|
UINT8 ack = netbuffer->ack;
|
||||||
getackpacket++;
|
getackpacket++;
|
||||||
if (cmpack(ack, node->firstacktosend) <= 0)
|
|
||||||
|
if (cmpack(ack, node->firstacktosend) <= 0
|
||||||
|
// UGLY PROBABLY-BAD HACK: If we get PT_CLIENTJOIN, assume this is an in-order packet?
|
||||||
|
&& netbuffer->packettype != PT_CLIENTJOIN
|
||||||
|
)
|
||||||
{
|
{
|
||||||
DEBFILE(va("Discard(1) ack %d (duplicated)\n", ack));
|
DEBFILE(va("Discard(1) ack %d (duplicated)\n", ack));
|
||||||
duppacket++;
|
duppacket++;
|
||||||
|
@ -385,6 +389,11 @@ static boolean Processackpak(void)
|
||||||
// Is a good packet so increment the acknowledge number,
|
// Is a good packet so increment the acknowledge number,
|
||||||
// Then search for a "hole" in the queue
|
// Then search for a "hole" in the queue
|
||||||
UINT8 nextfirstack = (UINT8)(node->firstacktosend + 1);
|
UINT8 nextfirstack = (UINT8)(node->firstacktosend + 1);
|
||||||
|
|
||||||
|
// UGLY PROBABLY-BAD HACK: If we get PT_CLIENTJOIN, assume this is an in-order packet?
|
||||||
|
if (netbuffer->packettype == PT_CLIENTJOIN)
|
||||||
|
node->firstacktosend = (UINT8)((ack-1+MAXACKTOSEND) % MAXACKTOSEND);
|
||||||
|
|
||||||
if (!nextfirstack)
|
if (!nextfirstack)
|
||||||
nextfirstack = 1;
|
nextfirstack = 1;
|
||||||
|
|
||||||
|
@ -1190,6 +1199,29 @@ boolean HGetPacket(void)
|
||||||
|
|
||||||
if (nodejustjoined)
|
if (nodejustjoined)
|
||||||
{
|
{
|
||||||
|
// If a new node sends an unexpected packet, just ignore it
|
||||||
|
if (server
|
||||||
|
&& !(netbuffer->packettype == PT_ASKINFO
|
||||||
|
|| netbuffer->packettype == PT_SERVERINFO
|
||||||
|
|| netbuffer->packettype == PT_PLAYERINFO
|
||||||
|
|| netbuffer->packettype == PT_REQUESTFILE
|
||||||
|
|| netbuffer->packettype == PT_ASKINFOVIAMS
|
||||||
|
|| netbuffer->packettype == PT_CLIENTJOIN))
|
||||||
|
{
|
||||||
|
DEBFILE(va("New node sent an unexpected %s packet\n", packettypename[netbuffer->packettype]));
|
||||||
|
CONS_Alert(CONS_NOTICE, "New node sent an unexpected %s packet\n", packettypename[netbuffer->packettype]);
|
||||||
|
Net_CloseConnection(doomcom->remotenode | FORCECLOSE);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (netbuffer->ack > 1 && !(server && netbuffer->packettype == PT_CLIENTJOIN))
|
||||||
|
{
|
||||||
|
DEBFILE("New node sent a packet with an out-of-sequence ack. Ghost connection? Ignoring...\n");
|
||||||
|
CONS_Alert(CONS_NOTICE, "New node sent a packet with an out-of-sequence ack. Ghost connection? Ignoring...\n");
|
||||||
|
Net_CloseConnection(doomcom->remotenode | FORCECLOSE);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// Reinitialize vars for the new node just in case there's anything left over from other players.....
|
// Reinitialize vars for the new node just in case there's anything left over from other players.....
|
||||||
InitNode(&nodes[doomcom->remotenode]);
|
InitNode(&nodes[doomcom->remotenode]);
|
||||||
SV_AbortSendFiles(doomcom->remotenode);
|
SV_AbortSendFiles(doomcom->remotenode);
|
||||||
|
@ -1222,21 +1254,6 @@ boolean HGetPacket(void)
|
||||||
DebugPrintpacket("GET");
|
DebugPrintpacket("GET");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// If a new node sends an unexpected packet, just ignore it
|
|
||||||
if (nodejustjoined && server
|
|
||||||
&& !(netbuffer->packettype == PT_ASKINFO
|
|
||||||
|| netbuffer->packettype == PT_SERVERINFO
|
|
||||||
|| netbuffer->packettype == PT_PLAYERINFO
|
|
||||||
|| netbuffer->packettype == PT_REQUESTFILE
|
|
||||||
|| netbuffer->packettype == PT_ASKINFOVIAMS
|
|
||||||
|| netbuffer->packettype == PT_CLIENTJOIN))
|
|
||||||
{
|
|
||||||
DEBFILE(va("New node sent an unexpected %s packet\n", packettypename[netbuffer->packettype]));
|
|
||||||
//CONS_Alert(CONS_NOTICE, "New node sent an unexpected %s packet\n", packettypename[netbuffer->packettype]);
|
|
||||||
Net_CloseConnection(doomcom->remotenode | FORCECLOSE);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Proceed the ack and ackreturn field
|
// Proceed the ack and ackreturn field
|
||||||
if (!Processackpak())
|
if (!Processackpak())
|
||||||
continue; // discarded (duplicated)
|
continue; // discarded (duplicated)
|
||||||
|
|
Loading…
Reference in a new issue