mirror of
https://github.com/ipxe/ipxe
synced 2025-12-28 02:28:57 +03:00
[tftp] Allow TFTP block size to be controlled via the PXE TFTP API
The PXE TFTP API allows the caller to request a particular TFTP block size. Since mid-2008, iPXE has appended a "?blksize=xxx" parameter to the TFTP URI constructed internally; nothing has ever parsed this parameter. Nobody seems to have cared that this parameter has been ignored for almost five years. Fix by using xfer_window(), which provides a fairly natural way to convey the block size information from the PXE TFTP API to the TFTP protocol layer. Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
@@ -71,6 +71,17 @@ static void pxe_tftp_close ( struct pxe_tftp_connection *pxe_tftp, int rc ) {
|
||||
pxe_tftp->rc = rc;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check flow control window
|
||||
*
|
||||
* @v pxe_tftp PXE TFTP connection
|
||||
* @ret len Length of window
|
||||
*/
|
||||
static size_t pxe_tftp_xfer_window ( struct pxe_tftp_connection *pxe_tftp ) {
|
||||
|
||||
return pxe_tftp->blksize;
|
||||
}
|
||||
|
||||
/**
|
||||
* Receive new data
|
||||
*
|
||||
@@ -128,6 +139,8 @@ static int pxe_tftp_xfer_deliver ( struct pxe_tftp_connection *pxe_tftp,
|
||||
static struct interface_operation pxe_tftp_xfer_ops[] = {
|
||||
INTF_OP ( xfer_deliver, struct pxe_tftp_connection *,
|
||||
pxe_tftp_xfer_deliver ),
|
||||
INTF_OP ( xfer_window, struct pxe_tftp_connection *,
|
||||
pxe_tftp_xfer_window ),
|
||||
INTF_OP ( intf_close, struct pxe_tftp_connection *, pxe_tftp_close ),
|
||||
};
|
||||
|
||||
@@ -167,19 +180,19 @@ static int pxe_tftp_open ( uint32_t ipaddress, unsigned int port,
|
||||
/* Reset PXE TFTP connection structure */
|
||||
memset ( &pxe_tftp, 0, sizeof ( pxe_tftp ) );
|
||||
intf_init ( &pxe_tftp.xfer, &pxe_tftp_xfer_desc, NULL );
|
||||
if ( blksize < TFTP_DEFAULT_BLKSIZE )
|
||||
blksize = TFTP_DEFAULT_BLKSIZE;
|
||||
pxe_tftp.blksize = blksize;
|
||||
pxe_tftp.rc = -EINPROGRESS;
|
||||
|
||||
/* Construct URI string */
|
||||
address.s_addr = ipaddress;
|
||||
if ( ! port )
|
||||
port = htons ( TFTP_PORT );
|
||||
if ( blksize < TFTP_DEFAULT_BLKSIZE )
|
||||
blksize = TFTP_DEFAULT_BLKSIZE;
|
||||
snprintf ( uri_string, sizeof ( uri_string ),
|
||||
"tftp%s://%s:%d%s%s?blksize=%zd",
|
||||
sizeonly ? "size" : "",
|
||||
inet_ntoa ( address ), ntohs ( port ),
|
||||
( ( filename[0] == '/' ) ? "" : "/" ), filename, blksize );
|
||||
snprintf ( uri_string, sizeof ( uri_string ), "tftp%s://%s:%d%s%s",
|
||||
sizeonly ? "size" : "", inet_ntoa ( address ),
|
||||
ntohs ( port ), ( ( filename[0] == '/' ) ? "" : "/" ),
|
||||
filename );
|
||||
DBG ( " %s", uri_string );
|
||||
|
||||
/* Open PXE TFTP connection */
|
||||
|
||||
Reference in New Issue
Block a user