Fix some issues with DATA ACK

This commit is contained in:
Florian Märkl 2019-07-30 22:43:38 +02:00
commit 8914ac5f0b
No known key found for this signature in database
GPG key ID: 125BC8A5A6A1E857
3 changed files with 11 additions and 13 deletions

View file

@ -773,6 +773,6 @@ CHIAKI_EXPORT ChiakiErrorCode stream_connection_send_corrupt_frame(ChiakiStreamC
return CHIAKI_ERR_UNKNOWN; return CHIAKI_ERR_UNKNOWN;
} }
CHIAKI_LOGD(stream_connection->log, "StreamConnection reporting corrupt frame(s) from %u to %u\n", (unsigned int)start, (unsigned int)end); CHIAKI_LOGD(stream_connection->log, "StreamConnection reporting corrupt frame(s) from %u to %u", (unsigned int)start, (unsigned int)end);
return chiaki_takion_send_message_data(&stream_connection->takion, 1, 2, buf, stream.bytes_written); return chiaki_takion_send_message_data(&stream_connection->takion, 1, 2, buf, stream.bytes_written);
} }

View file

@ -914,24 +914,22 @@ static void takion_handle_packet_message_data_ack(ChiakiTakion *takion, uint8_t
return; return;
} }
uint32_t seq_num = ntohl(*((uint32_t *)(buf + 0))); uint32_t cumulative_seq_num = ntohl(*((uint32_t *)(buf + 0)));
uint32_t a_rwnd = ntohl(*((uint32_t *)(buf + 4))); uint32_t a_rwnd = ntohl(*((uint32_t *)(buf + 4)));
uint16_t size_internal = ntohs(*((uint16_t *)(buf + 8))); uint16_t gap_ack_blocks_count = ntohs(*((uint16_t *)(buf + 8)));
uint16_t zero = ntohs(*((uint16_t *)(buf + 0xa))); uint16_t dup_tsns_count = ntohs(*((uint16_t *)(buf + 0xa)));
// this check is basically size_or_something != 0, but it is done like that in the original code, if(buf_size != gap_ack_blocks_count * 4 + 0xc)
// so I assume size_or_something may be the size of additional data coming after the data ack header.
if(buf_size != size_internal * 4 + 0xc)
{ {
CHIAKI_LOGW(takion->log, "Takion received data ack with invalid size_internal = %#x", size_internal); CHIAKI_LOGW(takion->log, "Takion received data ack with invalid gap_ack_blocks_count");
return; return;
} }
if(zero != 0) if(dup_tsns_count != 0)
CHIAKI_LOGW(takion->log, "Takion received data ack with nonzero %#x at buf+0xa", zero); CHIAKI_LOGW(takion->log, "Takion received data ack with nonzero dup_tsns_count %#x", dup_tsns_count);
//CHIAKI_LOGD(takion->log, "Takion received data ack with seq_num = %#x, something = %#x, size_or_something = %#x, zero = %#x", seq_num, something, size_internal, zero); //CHIAKI_LOGD(takion->log, "Takion received data ack with seq_num = %#x, something = %#x, size_or_something = %#x, zero = %#x", seq_num, something, size_internal, zero);
chiaki_takion_send_buffer_ack(&takion->send_buffer, seq_num); chiaki_takion_send_buffer_ack(&takion->send_buffer, cumulative_seq_num);
} }
/** /**

View file

@ -145,7 +145,7 @@ CHIAKI_EXPORT ChiakiErrorCode chiaki_takion_send_buffer_ack(ChiakiTakionSendBuff
size_t i; size_t i;
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) if(send_buffer->packets[i].seq_num == seq_num) // TODO: should be <= (with seqnum arithmetic)
break; break;
} }
@ -158,7 +158,7 @@ CHIAKI_EXPORT ChiakiErrorCode chiaki_takion_send_buffer_ack(ChiakiTakionSendBuff
free(send_buffer->packets[i].buf); free(send_buffer->packets[i].buf);
if(i < send_buffer->packets_count - 1) if(i < send_buffer->packets_count - 1)
memmove(send_buffer->packets + i, send_buffer->packets + i + 1, send_buffer->packets_count - i - 1); memmove(send_buffer->packets + i, send_buffer->packets + i + 1, (send_buffer->packets_count - i - 1) * sizeof(ChiakiTakionSendBufferPacket));
send_buffer->packets_count--; send_buffer->packets_count--;