mirror of
https://git.sr.ht/~thestr4ng3r/chiaki
synced 2025-08-20 21:43:12 -07:00
Fix cumulative ack
This commit is contained in:
parent
03b81e9509
commit
5d1d45543a
1 changed files with 36 additions and 13 deletions
|
@ -149,28 +149,51 @@ CHIAKI_EXPORT ChiakiErrorCode chiaki_takion_send_buffer_ack(ChiakiTakionSendBuff
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
size_t i;
|
size_t i;
|
||||||
|
size_t shift = 0; // amount to shift back
|
||||||
|
size_t shift_start = SIZE_MAX;
|
||||||
for(i=0; i<send_buffer->packets_count; i++)
|
for(i=0; i<send_buffer->packets_count; i++)
|
||||||
{
|
{
|
||||||
if(send_buffer->packets[i].seq_num == seq_num) // TODO: should be <= (with seqnum arithmetic)
|
if(send_buffer->packets[i].seq_num == seq_num || chiaki_seq_num_32_lt(send_buffer->packets[i].seq_num, seq_num))
|
||||||
break;
|
{
|
||||||
|
free(send_buffer->packets[i].buf);
|
||||||
|
if(shift_start == SIZE_MAX)
|
||||||
|
{
|
||||||
|
// first shift
|
||||||
|
shift_start = i;
|
||||||
|
shift = 1;
|
||||||
|
}
|
||||||
|
else if(shift_start + shift == i)
|
||||||
|
{
|
||||||
|
// still in the same gap
|
||||||
|
shift++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// new gap, do shift
|
||||||
|
memmove(send_buffer->packets + shift_start,
|
||||||
|
send_buffer->packets + shift_start + shift,
|
||||||
|
(i - (shift_start + shift)) * sizeof(ChiakiTakionSendBufferPacket));
|
||||||
|
// start new shift
|
||||||
|
shift_start = i - shift;
|
||||||
|
shift++;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(i == send_buffer->packets_count)
|
if(shift_start != SIZE_MAX)
|
||||||
{
|
{
|
||||||
CHIAKI_LOGW(send_buffer->log, "Takion Send Buffer got ack for seqnum not in buffer");
|
// do final shift
|
||||||
goto beach;
|
if(shift_start + shift < send_buffer->packets_count)
|
||||||
|
{
|
||||||
|
memmove(send_buffer->packets + shift_start,
|
||||||
|
send_buffer->packets + shift_start + shift,
|
||||||
|
(send_buffer->packets_count - (shift_start + shift)) * sizeof(ChiakiTakionSendBufferPacket));
|
||||||
|
}
|
||||||
|
send_buffer->packets_count -= shift;
|
||||||
}
|
}
|
||||||
|
|
||||||
free(send_buffer->packets[i].buf);
|
|
||||||
|
|
||||||
if(i < send_buffer->packets_count - 1)
|
|
||||||
memmove(send_buffer->packets + i, send_buffer->packets + i + 1, (send_buffer->packets_count - i - 1) * sizeof(ChiakiTakionSendBufferPacket));
|
|
||||||
|
|
||||||
send_buffer->packets_count--;
|
|
||||||
|
|
||||||
CHIAKI_LOGD(send_buffer->log, "Acked seq num %#llx from Takion Send Buffer", (unsigned long long)seq_num);
|
CHIAKI_LOGD(send_buffer->log, "Acked seq num %#llx from Takion Send Buffer", (unsigned long long)seq_num);
|
||||||
|
|
||||||
beach:
|
|
||||||
chiaki_mutex_unlock(&send_buffer->mutex);
|
chiaki_mutex_unlock(&send_buffer->mutex);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue