return rc;
}
-/**
- * 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_get_dest ( xfer );
- int rc;
-
- DBGC ( xfer, "XFER %p->%p request %s+%ld %zd\n", xfer, dest,
- whence_text ( whence ), offset, len );
-
- rc = dest->op->request ( dest, offset, whence, len );
-
- if ( rc != 0 ) {
- DBGC ( xfer, "XFER %p<-%p request: %s\n", xfer, dest,
- strerror ( rc ) );
- }
- xfer_put ( dest );
- return rc;
-}
-
/**
* Seek to position
*
}
/**
- * Test to see if interface is ready to accept data
+ * Check flow control window
*
* @v xfer Data transfer interface
- * @ret rc Return status code
- *
- * This test is optional; the data transfer interface may wish that it
- * does not yet wish to accept data, but cannot prevent attempts to
- * deliver data to it.
+ * @ret len Length of window
*/
-int xfer_ready ( struct xfer_interface *xfer ) {
- return xfer_seek ( xfer, 0, SEEK_CUR );
+size_t xfer_window ( struct xfer_interface *xfer ) {
+ struct xfer_interface *dest = xfer_get_dest ( xfer );
+ size_t len;
+
+ len = dest->op->window ( dest );
+
+ xfer_put ( dest );
+ return len;
}
/**
}
/**
- * Ignore request() event
+ * Ignore seek() 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 ) {
+int ignore_xfer_seek ( struct xfer_interface *xfer __unused,
+ off_t offset __unused, int whence __unused ) {
return 0;
}
/**
- * Ignore seek() event
+ * Unlimited flow control window
*
* @v xfer Data transfer interface
- * @v offset Offset to new position
- * @v whence Basis for new position
- * @ret rc Return status code
+ * @ret len Length of window
+ *
+ * This handler indicates that the interface is always ready to accept
+ * data.
*/
-int ignore_xfer_seek ( struct xfer_interface *xfer __unused,
- off_t offset __unused, int whence __unused ) {
+size_t unlimited_xfer_window ( struct xfer_interface *xfer __unused ) {
+ return ~( ( size_t ) 0 );
+}
+
+/**
+ * No flow control window
+ *
+ * @v xfer Data transfer interface
+ * @ret len Length of window
+ *
+ * This handler indicates that the interface is never ready to accept
+ * data.
+ */
+size_t no_xfer_window ( struct xfer_interface *xfer __unused ) {
return 0;
}
struct xfer_interface_operations null_xfer_ops = {
.close = ignore_xfer_close,
.vredirect = ignore_xfer_vredirect,
- .request = ignore_xfer_request,
.seek = ignore_xfer_seek,
+ .window = unlimited_xfer_window,
.alloc_iob = default_xfer_alloc_iob,
.deliver_iob = xfer_deliver_as_raw,
.deliver_raw = ignore_xfer_deliver_raw,