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:
parent
c277bd6ce7
commit
0ac827848d
18
lib/tftp.c
18
lib/tftp.c
@ -591,16 +591,26 @@ static CURLcode tftp_rx(tftp_state_data_t *state, tftp_event_t event)
|
|||||||
case TFTP_EVENT_DATA:
|
case TFTP_EVENT_DATA:
|
||||||
/* Is this the block we expect? */
|
/* Is this the block we expect? */
|
||||||
rblock = getrpacketblock(&state->rpacket);
|
rblock = getrpacketblock(&state->rpacket);
|
||||||
if(NEXT_BLOCKNUM(state->block) != rblock) {
|
if( NEXT_BLOCKNUM(state->block) == rblock ) {
|
||||||
/* No, log it */
|
/* 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,
|
infof(data,
|
||||||
"Received unexpected DATA packet block %d, expecting block %d\n",
|
"Received unexpected DATA packet block %d, expecting block %d\n",
|
||||||
rblock, NEXT_BLOCKNUM(state->block));
|
rblock, NEXT_BLOCKNUM(state->block));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/* This is the expected block. Reset counters and ACK it. */
|
|
||||||
|
/* ACK this block. */
|
||||||
state->block = (unsigned short)rblock;
|
state->block = (unsigned short)rblock;
|
||||||
state->retries = 0;
|
|
||||||
setpacketevent(&state->spacket, TFTP_EVENT_ACK);
|
setpacketevent(&state->spacket, TFTP_EVENT_ACK);
|
||||||
setpacketblock(&state->spacket, state->block);
|
setpacketblock(&state->spacket, state->block);
|
||||||
sbytes = sendto(state->sockfd, (void *)state->spacket.data,
|
sbytes = sendto(state->sockfd, (void *)state->spacket.data,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user