summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Brown2010-09-05 02:16:29 +0200
committerMichael Brown2010-09-05 04:12:17 +0200
commitc8199aacaa01a5ef3a13d958a8a46206bd0a6eea (patch)
treecc7f9124ad98a2b4677278933a15456e7553a870
parent[infiniband] Add the concept of an Infiniband upper-layer driver (diff)
downloadipxe-c8199aacaa01a5ef3a13d958a8a46206bd0a6eea.tar.gz
ipxe-c8199aacaa01a5ef3a13d958a8a46206bd0a6eea.tar.xz
ipxe-c8199aacaa01a5ef3a13d958a8a46206bd0a6eea.zip
[xfer] Add xfer_window_changed()
xfer_window_changed() can be used to notify peers that an interface is now ready to accept data. This can potentially be used to eliminate the need for wasteful processes that simply poll xfer_window() until the window becomes non-zero. Signed-off-by: Michael Brown <mcb30@ipxe.org>
-rw-r--r--src/core/xfer.c27
-rw-r--r--src/include/ipxe/xfer.h4
2 files changed, 31 insertions, 0 deletions
diff --git a/src/core/xfer.c b/src/core/xfer.c
index 222af52a..a755d438 100644
--- a/src/core/xfer.c
+++ b/src/core/xfer.c
@@ -105,6 +105,33 @@ size_t xfer_window ( struct interface *intf ) {
}
/**
+ * Report change of flow control window
+ *
+ * @v intf Data transfer interface
+ *
+ * Note that this method is used to indicate only unsolicited changes
+ * in the flow control window. In particular, this method must not be
+ * called as part of the response to xfer_deliver(), since that could
+ * easily lead to an infinite loop. Callers of xfer_deliver() should
+ * assume that the flow control window will have changed without
+ * generating an xfer_window_changed() message.
+ */
+void xfer_window_changed ( struct interface *intf ) {
+ struct interface *dest;
+ xfer_window_changed_TYPE ( void * ) *op =
+ intf_get_dest_op ( intf, xfer_window_changed, &dest );
+ void *object = intf_object ( dest );
+
+ if ( op ) {
+ op ( object );
+ } else {
+ /* Default is to do nothing */
+ }
+
+ intf_put ( dest );
+}
+
+/**
* Allocate I/O buffer
*
* @v intf Data transfer interface
diff --git a/src/include/ipxe/xfer.h b/src/include/ipxe/xfer.h
index 2aa35f8d..0c030327 100644
--- a/src/include/ipxe/xfer.h
+++ b/src/include/ipxe/xfer.h
@@ -57,6 +57,10 @@ extern size_t xfer_window ( struct interface *intf );
#define xfer_window_TYPE( object_type ) \
typeof ( size_t ( object_type ) )
+extern void xfer_window_changed ( struct interface *intf );
+#define xfer_window_changed_TYPE( object_type ) \
+ typeof ( void ( object_type ) )
+
extern struct io_buffer * xfer_alloc_iob ( struct interface *intf,
size_t len );
#define xfer_alloc_iob_TYPE( object_type ) \