mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2025-03-13 22:33:32 +00:00
Remove acktosend
This commit is contained in:
parent
14020edacf
commit
07738b61d2
1 changed files with 18 additions and 152 deletions
|
@ -163,12 +163,6 @@ typedef struct
|
|||
// ack return to send (like sliding window protocol)
|
||||
UINT8 firstacktosend;
|
||||
|
||||
// when no consecutive packets are received we keep in mind what packets
|
||||
// we already received in a queue
|
||||
UINT8 acktosend_head;
|
||||
UINT8 acktosend_tail;
|
||||
UINT8 acktosend[MAXACKTOSEND];
|
||||
|
||||
// automatically send keep alive packet when not enough trafic
|
||||
tic_t lasttimeacktosend_sent;
|
||||
// detect connection lost
|
||||
|
@ -297,114 +291,28 @@ static boolean Processackpak(void)
|
|||
}
|
||||
else
|
||||
{
|
||||
// Check if it is not already in the queue
|
||||
for (INT32 i = node->acktosend_tail; i != node->acktosend_head; i = (i+1) % MAXACKTOSEND)
|
||||
if (node->acktosend[i] == ack)
|
||||
{
|
||||
DEBFILE(va("Discard(2) ack %d (duplicated)\n", ack));
|
||||
duppacket++;
|
||||
goodpacket = false; // Discard packet (duplicate)
|
||||
break;
|
||||
}
|
||||
if (goodpacket)
|
||||
// Is a good packet so increment the acknowledge number,
|
||||
// Then search for a "hole" in the queue
|
||||
UINT8 nextfirstack = (UINT8)(node->firstacktosend + 1);
|
||||
if (!nextfirstack)
|
||||
nextfirstack = 1;
|
||||
|
||||
if (ack == nextfirstack)
|
||||
{
|
||||
// Is a good packet so increment the acknowledge number,
|
||||
// Then search for a "hole" in the queue
|
||||
UINT8 nextfirstack = (UINT8)(node->firstacktosend + 1);
|
||||
if (!nextfirstack)
|
||||
nextfirstack = 1;
|
||||
|
||||
if (ack == nextfirstack)
|
||||
{
|
||||
UINT8 hm1; // head - 1
|
||||
boolean change = true;
|
||||
|
||||
node->firstacktosend = nextfirstack++;
|
||||
if (!nextfirstack)
|
||||
nextfirstack = 1;
|
||||
hm1 = (UINT8)((node->acktosend_head-1+MAXACKTOSEND) % MAXACKTOSEND);
|
||||
while (change)
|
||||
{
|
||||
change = false;
|
||||
for (INT32 i = node->acktosend_tail; i != node->acktosend_head;
|
||||
i = (i+1) % MAXACKTOSEND)
|
||||
{
|
||||
if (cmpack(node->acktosend[i], nextfirstack) <= 0)
|
||||
{
|
||||
if (node->acktosend[i] == nextfirstack)
|
||||
{
|
||||
node->firstacktosend = nextfirstack++;
|
||||
if (!nextfirstack)
|
||||
nextfirstack = 1;
|
||||
change = true;
|
||||
}
|
||||
if (i == node->acktosend_tail)
|
||||
{
|
||||
node->acktosend[node->acktosend_tail] = 0;
|
||||
node->acktosend_tail = (UINT8)((i+1) % MAXACKTOSEND);
|
||||
}
|
||||
else if (i == hm1)
|
||||
{
|
||||
node->acktosend[hm1] = 0;
|
||||
node->acktosend_head = hm1;
|
||||
hm1 = (UINT8)((hm1-1+MAXACKTOSEND) % MAXACKTOSEND);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else // Out of order packet
|
||||
{
|
||||
// Don't increment firsacktosend, put it in asktosend queue
|
||||
// Will be incremented when the nextfirstack comes (code above)
|
||||
UINT8 newhead = (UINT8)((node->acktosend_head+1) % MAXACKTOSEND);
|
||||
DEBFILE(va("out of order packet (%d expected)\n", nextfirstack));
|
||||
if (newhead != node->acktosend_tail)
|
||||
{
|
||||
node->acktosend[node->acktosend_head] = ack;
|
||||
node->acktosend_head = newhead;
|
||||
}
|
||||
else // Buffer full discard packet, sender will resend it
|
||||
{ // We can admit the packet but we will not detect the duplication after :(
|
||||
DEBFILE("no more freeackret\n");
|
||||
goodpacket = false;
|
||||
}
|
||||
}
|
||||
node->firstacktosend = nextfirstack;
|
||||
}
|
||||
else // Out of order packet
|
||||
{
|
||||
// Don't increment firsacktosend, put it in asktosend queue
|
||||
// Will be incremented when the nextfirstack comes (code above)
|
||||
DEBFILE(va("out of order packet (%d expected)\n", nextfirstack));
|
||||
goodpacket = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return goodpacket;
|
||||
}
|
||||
|
||||
// send special packet with only ack on it
|
||||
void Net_SendAcks(INT32 node)
|
||||
{
|
||||
netbuffer->packettype = PT_NOTHING;
|
||||
M_Memcpy(netbuffer->u.textcmd, nodes[node].acktosend, MAXACKTOSEND);
|
||||
HSendPacket(node, false, 0, MAXACKTOSEND);
|
||||
}
|
||||
|
||||
static void GotAcks(void)
|
||||
{
|
||||
for (INT32 j = 0; j < MAXACKTOSEND; j++)
|
||||
if (netbuffer->u.textcmd[j])
|
||||
for (INT32 i = 0; i < MAXACKPACKETS; i++)
|
||||
if (ackpak[i].acknum && ackpak[i].destinationnode == doomcom->remotenode)
|
||||
{
|
||||
if (ackpak[i].acknum == netbuffer->u.textcmd[j])
|
||||
RemoveAck(i);
|
||||
// nextacknum is first equal to acknum, then when receiving bigger ack
|
||||
// there is big chance the packet is lost
|
||||
// When resent, nextacknum = nodes[node].nextacknum
|
||||
// will redo the same but with different value
|
||||
else if (cmpack(ackpak[i].nextacknum, netbuffer->u.textcmd[j]) <= 0
|
||||
&& ackpak[i].senttime > 0)
|
||||
{
|
||||
ackpak[i].senttime--; // hurry up
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Net_ConnectionTimeout(INT32 node)
|
||||
{
|
||||
// Don't timeout several times
|
||||
|
@ -458,11 +366,6 @@ void Net_AckTicker(void)
|
|||
// This is something like node open flag
|
||||
if (nodes[i].firstacktosend)
|
||||
{
|
||||
// We haven't sent a packet for a long time
|
||||
// Acknowledge packet if needed
|
||||
if (nodes[i].lasttimeacktosend_sent + ACKTOSENDTIMEOUT < I_GetTime())
|
||||
Net_SendAcks(i);
|
||||
|
||||
if (!(nodes[i].flags & NF_CLOSE)
|
||||
&& nodes[i].lasttimepacketreceived + connectiontimeout < I_GetTime())
|
||||
{
|
||||
|
@ -476,37 +379,12 @@ void Net_AckTicker(void)
|
|||
// (the higher layer doesn't have room, or something else ....)
|
||||
void Net_UnAcknowledgePacket(INT32 node)
|
||||
{
|
||||
INT32 hm1 = (nodes[node].acktosend_head-1+MAXACKTOSEND) % MAXACKTOSEND;
|
||||
DEBFILE(va("UnAcknowledge node %d\n", node));
|
||||
if (!node)
|
||||
return;
|
||||
if (nodes[node].acktosend[hm1] == netbuffer->ack)
|
||||
{
|
||||
nodes[node].acktosend[hm1] = 0;
|
||||
nodes[node].acktosend_head = (UINT8)hm1;
|
||||
}
|
||||
else if (nodes[node].firstacktosend == netbuffer->ack)
|
||||
{
|
||||
nodes[node].firstacktosend--;
|
||||
if (!nodes[node].firstacktosend)
|
||||
nodes[node].firstacktosend = UINT8_MAX;
|
||||
}
|
||||
else
|
||||
{
|
||||
while (nodes[node].firstacktosend != netbuffer->ack)
|
||||
{
|
||||
nodes[node].acktosend_tail = (UINT8)
|
||||
((nodes[node].acktosend_tail-1+MAXACKTOSEND) % MAXACKTOSEND);
|
||||
nodes[node].acktosend[nodes[node].acktosend_tail] = nodes[node].firstacktosend;
|
||||
|
||||
nodes[node].firstacktosend--;
|
||||
if (!nodes[node].firstacktosend)
|
||||
nodes[node].firstacktosend = UINT8_MAX;
|
||||
}
|
||||
nodes[node].firstacktosend++;
|
||||
if (!nodes[node].firstacktosend)
|
||||
nodes[node].firstacktosend = 1;
|
||||
}
|
||||
nodes[node].firstacktosend--;
|
||||
if (!nodes[node].firstacktosend)
|
||||
nodes[node].firstacktosend = UINT8_MAX;
|
||||
}
|
||||
|
||||
/** Checks if all acks have been received
|
||||
|
@ -549,8 +427,6 @@ void Net_WaitAllAckReceived(UINT32 timeout)
|
|||
|
||||
static void InitNode(node_t *node)
|
||||
{
|
||||
node->acktosend_head = node->acktosend_tail = 0;
|
||||
memset(node->acktosend, 0, sizeof(node->acktosend));
|
||||
node->firstacktosend = 0;
|
||||
node->nextacknum = 1;
|
||||
node->remotefirstack = 0;
|
||||
|
@ -609,13 +485,6 @@ void Net_CloseConnection(INT32 node)
|
|||
|
||||
nodes[node].flags |= NF_CLOSE;
|
||||
|
||||
// try to Send ack back (two army problem)
|
||||
if (GetAcktosend(node))
|
||||
{
|
||||
Net_SendAcks(node);
|
||||
Net_SendAcks(node);
|
||||
}
|
||||
|
||||
// check if we are waiting for an ack from this node
|
||||
for (INT32 i = 0; i < MAXACKPACKETS; i++)
|
||||
if (ackpak[i].acknum && ackpak[i].destinationnode == node)
|
||||
|
@ -1065,10 +934,7 @@ boolean HGetPacket(void)
|
|||
|
||||
// A packet with just ackreturn
|
||||
if (netbuffer->packettype == PT_NOTHING)
|
||||
{
|
||||
GotAcks();
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue