tftp_rx: handle resends

Re-send ACK for block X in case we receive block X data again while
waiting for block X+1.

Based on an earlier patch by Marcin Adamski.
This commit is contained in:
Christian Vogt 2012-11-16 15:30:52 +01:00 committed by Daniel Stenberg
parent c277bd6ce7
commit 0ac827848d

View File

@ -591,16 +591,26 @@ static CURLcode tftp_rx(tftp_state_data_t *state, tftp_event_t event)
case TFTP_EVENT_DATA:
/* Is this the block we expect? */
rblock = getrpacketblock(&state->rpacket);
if(NEXT_BLOCKNUM(state->block) != rblock) {
/* No, log it */
if( NEXT_BLOCKNUM(state->block) == rblock ) {
/* This is the expected block. Reset counters and ACK it. */
state->retries = 0;
}
else if( state->block == rblock ) {
/* This is the last recently received block again. Log it and ACK it again. */
infof(data,
"Received last DATA packet block %d again.\n",
rblock);
}
else {
/* totally unexpected, just log it */
infof(data,
"Received unexpected DATA packet block %d, expecting block %d\n",
rblock, NEXT_BLOCKNUM(state->block));
break;
}
/* This is the expected block. Reset counters and ACK it. */
/* ACK this block. */
state->block = (unsigned short)rblock;
state->retries = 0;
setpacketevent(&state->spacket, TFTP_EVENT_ACK);
setpacketblock(&state->spacket, state->block);
sbytes = sendto(state->sockfd, (void *)state->spacket.data,