diff options
author | Michael Brown <mcb30@etherboot.org> | 2007-05-15 15:23:09 +0000 |
---|---|---|
committer | Michael Brown <mcb30@etherboot.org> | 2007-05-15 15:23:09 +0000 |
commit | 5471bfbbbe9f49f7be7f2ca92b8c99a02c435458 (patch) | |
tree | b2dcb5f373672a767336ddba8d7e25fcc3f0c554 /src/core/xfer.c | |
parent | 817a446cc6e80e04388250624a335ac0083ea79a (diff) | |
download | ipxe-5471bfbbbe9f49f7be7f2ca92b8c99a02c435458.tar.gz |
Data-transfer interface should now be functionally complete.
Diffstat (limited to 'src/core/xfer.c')
-rw-r--r-- | src/core/xfer.c | 124 |
1 files changed, 92 insertions, 32 deletions
diff --git a/src/core/xfer.c b/src/core/xfer.c index 8a5d03d83..bfbf1ceda 100644 --- a/src/core/xfer.c +++ b/src/core/xfer.c @@ -40,19 +40,6 @@ void xfer_close ( struct xfer_interface *xfer, int rc ) { } /** - * Seek to position - * - * @v xfer Data transfer interface - * @v pos New position - * @ret rc Return status code - */ -int xfer_seek ( struct xfer_interface *xfer, size_t pos ) { - struct xfer_interface *dest = xfer_dest ( xfer ); - - return dest->op->seek ( dest, pos ); -} - -/** * Send redirection event * * @v xfer Data transfer interface @@ -85,16 +72,69 @@ int xfer_redirect ( struct xfer_interface *xfer, int type, ... ) { } /** + * Request data + * + * @v xfer Data transfer interface + * @v offset Offset to new position + * @v whence Basis for new position + * @v len Length of requested data + * @ret rc Return status code + */ +int xfer_request ( struct xfer_interface *xfer, off_t offset, int whence, + size_t len ) { + struct xfer_interface *dest = xfer_dest ( xfer ); + + return dest->op->request ( dest, offset, whence, len ); +} + +/** + * Request all data + * + * @v xfer Data transfer interface + * @ret rc Return status code + */ +int xfer_request_all ( struct xfer_interface *xfer ) { + return xfer_request ( xfer, 0, SEEK_SET, ~( ( size_t ) 0 ) ); +} + +/** + * Seek to position + * + * @v xfer Data transfer interface + * @v offset Offset to new position + * @v whence Basis for new position + * @ret rc Return status code + */ +int xfer_seek ( struct xfer_interface *xfer, off_t offset, int whence ) { + struct xfer_interface *dest = xfer_dest ( xfer ); + + return dest->op->seek ( dest, offset, whence ); +} + +/** + * Allocate I/O buffer + * + * @v xfer Data transfer interface + * @v len I/O buffer payload length + * @ret iobuf I/O buffer + */ +struct io_buffer * xfer_alloc_iob ( struct xfer_interface *xfer, size_t len ) { + struct xfer_interface *dest = xfer_dest ( xfer ); + + return dest->op->alloc_iob ( dest, len ); +} + +/** * Deliver datagram * * @v xfer Data transfer interface * @v iobuf Datagram I/O buffer * @ret rc Return status code */ -int xfer_deliver ( struct xfer_interface *xfer, struct io_buffer *iobuf ) { +int xfer_deliver_iob ( struct xfer_interface *xfer, struct io_buffer *iobuf ) { struct xfer_interface *dest = xfer_dest ( xfer ); - return dest->op->deliver ( dest, iobuf ); + return dest->op->deliver_iob ( dest, iobuf ); } /** @@ -121,15 +161,6 @@ int xfer_deliver_raw ( struct xfer_interface *xfer, */ /** - * Ignore start() event - * - * @v xfer Data transfer interface - */ -void ignore_xfer_start ( struct xfer_interface *xfer __unused ) { - /* Nothing to do */ -} - -/** * Ignore close() event * * @v xfer Data transfer interface @@ -154,18 +185,46 @@ int ignore_xfer_vredirect ( struct xfer_interface *xfer __unused, } /** + * Ignore request() event + * + * @v xfer Data transfer interface + * @v offset Offset to new position + * @v whence Basis for new position + * @v len Length of requested data + * @ret rc Return status code + */ +int ignore_xfer_request ( struct xfer_interface *xfer __unused, + off_t offset __unused, int whence __unused, + size_t len __unused ) { + return 0; +} + +/** * Ignore seek() event * * @v xfer Data transfer interface - * @v pos New position + * @v offset Offset to new position + * @v whence Basis for new position * @ret rc Return status code */ int ignore_xfer_seek ( struct xfer_interface *xfer __unused, - size_t pos __unused ) { + off_t offset __unused, int whence __unused ) { return 0; } /** + * Allocate I/O buffer + * + * @v xfer Data transfer interface + * @v len I/O buffer payload length + * @ret iobuf I/O buffer + */ +struct io_buffer * +default_xfer_alloc_iob ( struct xfer_interface *xfer __unused, size_t len ) { + return alloc_iob ( len ); +} + +/** * Deliver datagram as raw data * * @v xfer Data transfer interface @@ -195,16 +254,16 @@ int xfer_deliver_as_raw ( struct xfer_interface *xfer, * This function is intended to be used as the deliver_raw() method * for data transfer interfaces that prefer to handle I/O buffers. */ -int xfer_deliver_as_iobuf ( struct xfer_interface *xfer, - const void *data, size_t len ) { +int xfer_deliver_as_iob ( struct xfer_interface *xfer, + const void *data, size_t len ) { struct io_buffer *iobuf; - iobuf = alloc_iob ( len ); + iobuf = xfer->op->alloc_iob ( xfer, len ); if ( ! iobuf ) return -ENOMEM; memcpy ( iob_put ( iobuf, len ), data, len ); - return xfer->op->deliver ( xfer, iobuf ); + return xfer->op->deliver_iob ( xfer, iobuf ); } /** @@ -225,11 +284,12 @@ int ignore_xfer_deliver_raw ( struct xfer_interface *xfer, /** Null data transfer interface operations */ struct xfer_interface_operations null_xfer_ops = { - .start = ignore_xfer_start, .close = ignore_xfer_close, .vredirect = ignore_xfer_vredirect, + .request = ignore_xfer_request, .seek = ignore_xfer_seek, - .deliver = xfer_deliver_as_raw, + .alloc_iob = default_xfer_alloc_iob, + .deliver_iob = xfer_deliver_as_raw, .deliver_raw = ignore_xfer_deliver_raw, }; |