summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Hajnoczi2010-01-10 20:05:17 +0100
committerMarty Connor2010-01-15 21:54:36 +0100
commitdd99ee95cb513384a13c2be486f684e4a1606ea9 (patch)
treef3d7a4a42263d0b4f82fa1e32da2aba1bfcb9145
parent[dhcp] Assume PXE options are in DHCPOFFER only if boot menu is included (diff)
downloadipxe-dd99ee95cb513384a13c2be486f684e4a1606ea9.tar.gz
ipxe-dd99ee95cb513384a13c2be486f684e4a1606ea9.tar.xz
ipxe-dd99ee95cb513384a13c2be486f684e4a1606ea9.zip
[tftp] Allow fetching larger files by wrapping block number
This patch adds TFTP support for files larger than 65535 blocks by wrapping the 16-bit block number. Reported-by: Mark Johnson <johnson.nh@gmail.com> Signed-off-by: Stefan Hajnoczi <stefanha@gmail.com> Signed-off-by: Marty Connor <mdc@etherboot.org>
-rw-r--r--src/net/udp/tftp.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/src/net/udp/tftp.c b/src/net/udp/tftp.c
index bb031ecf..82055fcd 100644
--- a/src/net/udp/tftp.c
+++ b/src/net/udp/tftp.c
@@ -747,7 +747,7 @@ static int tftp_rx_data ( struct tftp_request *tftp,
struct io_buffer *iobuf ) {
struct tftp_data *data = iobuf->data;
struct xfer_metadata meta;
- int block;
+ unsigned int block;
off_t offset;
size_t data_len;
int rc;
@@ -759,14 +759,17 @@ static int tftp_rx_data ( struct tftp_request *tftp,
rc = -EINVAL;
goto done;
}
- if ( data->block == 0 ) {
+
+ /* Calculate block number */
+ block = ( ( bitmap_first_gap ( &tftp->bitmap ) + 1 ) & ~0xffff );
+ if ( data->block == 0 && block == 0 ) {
DBGC ( tftp, "TFTP %p received data block 0\n", tftp );
rc = -EINVAL;
goto done;
}
+ block += ( ntohs ( data->block ) - 1 );
/* Extract data */
- block = ( ntohs ( data->block ) - 1 );
offset = ( block * tftp->blksize );
iob_pull ( iobuf, sizeof ( *data ) );
data_len = iob_len ( iobuf );