Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:12.3
atftp
atftp-0.7-sorcerers_apprentice.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File atftp-0.7-sorcerers_apprentice.patch of Package atftp
Index: atftp-0.7/tftp_file.c =================================================================== --- atftp-0.7.orig/tftp_file.c 2011-11-22 15:12:53.792744083 +0100 +++ atftp-0.7/tftp_file.c 2011-11-22 15:13:51.706421893 +0100 @@ -605,6 +605,7 @@ int timeout_state = state; /* what state should we go on when timeout */ int result; long block_number = 0; + long last_requested_block = -1; long last_block = -1; int data_size; /* size of data received */ int sockfd = data->sockfd; /* just to simplify calls */ @@ -765,6 +766,17 @@ connected = 1; } block_number = ntohs(tftphdr->th_block); + + if (last_requested_block >= block_number) + { + if (data->trace) + fprintf(stderr, "received duplicated ACK <block: %ld >= %ld>\n", + last_requested_block, block_number); + break; + } + else + last_requested_block = block_number; + if (data->trace) fprintf(stderr, "received ACK <block: %ld>\n", block_number); Index: atftp-0.7/tftpd_file.c =================================================================== --- atftp-0.7.orig/tftpd_file.c 2011-11-22 15:12:53.793744112 +0100 +++ atftp-0.7/tftpd_file.c 2011-11-22 15:15:04.617534260 +0100 @@ -403,6 +403,7 @@ int timeout_state = state; int result; long block_number = 0; + long last_requested_block = -1; long last_block = -1; int block_loops = 0; int data_size; @@ -859,6 +860,32 @@ { logger(LOG_DEBUG, "received ACK <block: %d>", block_number); } + + /* check whether the block request isn't already fulfilled */ + + /* multicast, block numbers could contain gaps */ + if (multicast) { + if (last_requested_block >= block_number) + { + if (data->trace) + logger(LOG_DEBUG, "received duplicated ACK <block: %d >= %d>", last_requested_block, block_number); + break; + } + else + last_requested_block = block_number; + /* unicast, blocks should be requested one after another */ + } else { + if (last_requested_block + 1 != block_number && last_requested_block != -1) + { + if (data->trace) + logger(LOG_DEBUG, "received out of order ACK <block: %d != %d>", last_requested_block + 1, block_number); + break; + } + else + last_requested_block = block_number; + } + + if (ntohs(tftphdr->th_block) == 65535) { block_loops++; @@ -958,6 +985,8 @@ /* nedd to send an oack to that client */ state = S_SEND_OACK; fseek(fp, 0, SEEK_SET); + /* reset the last block received counter */ + last_requested_block = -1; } else {
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor