aboutsummaryrefslogtreecommitdiffstats
path: root/src/include
diff options
context:
space:
mode:
authorMichael Brown <mcb30@ipxe.org>2010-06-16 01:31:29 +0100
committerMichael Brown <mcb30@ipxe.org>2010-06-22 15:50:31 +0100
commit4327d5d39f101f1df0ace6c03f3b3ada5f6a6213 (patch)
treeccf92bdfd23046b6c7f64f87b57350f02f63ad6f /src/include
parent7b4fbd93a5f45355e4e5d30e5d34c310f6d30c05 (diff)
downloadipxe-4327d5d39f101f1df0ace6c03f3b3ada5f6a6213.tar.gz
[interface] Convert all data-xfer interfaces to generic interfaces
Remove data-xfer as an interface type, and replace data-xfer interfaces with generic interfaces supporting the data-xfer methods. Filter interfaces (as used by the TLS layer) are handled using the generic pass-through interface capability. A side-effect of this is that deliver_raw() no longer exists as a data-xfer method. (In practice this doesn't lose any efficiency, since there are no instances within the current codebase where xfer_deliver_raw() is used to pass data to an interface supporting the deliver_raw() method.) Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/include')
-rw-r--r--src/include/ipxe/filter.h75
-rw-r--r--src/include/ipxe/http.h6
-rw-r--r--src/include/ipxe/ib_cmrc.h2
-rw-r--r--src/include/ipxe/iscsi.h2
-rw-r--r--src/include/ipxe/open.h28
-rw-r--r--src/include/ipxe/srp.h2
-rw-r--r--src/include/ipxe/tls.h10
-rw-r--r--src/include/ipxe/udp.h7
-rw-r--r--src/include/ipxe/xfer.h245
9 files changed, 60 insertions, 317 deletions
diff --git a/src/include/ipxe/filter.h b/src/include/ipxe/filter.h
deleted file mode 100644
index b23a98d91..000000000
--- a/src/include/ipxe/filter.h
+++ /dev/null
@@ -1,75 +0,0 @@
-#ifndef _IPXE_FILTER_H
-#define _IPXE_FILTER_H
-
-/** @file
- *
- * Data transfer filters
- *
- */
-
-FILE_LICENCE ( GPL2_OR_LATER );
-
-#include <stddef.h>
-#include <ipxe/xfer.h>
-
-/**
- * Half of a data transfer filter
- *
- * Embed two of these structures within a structure implementing a
- * data transfer filter, and intialise with filter_init(). You can
- * then use the filter_xxx() methods as the data transfer interface
- * methods as required.
- */
-struct xfer_filter_half {
- /** Data transfer interface */
- struct xfer_interface xfer;
- /** Other half of the data transfer filter */
- struct xfer_filter_half *other;
-};
-
-/**
- * Get data transfer interface for the other half of a data transfer filter
- *
- * @v xfer Data transfer interface
- * @ret other Other half's data transfer interface
- */
-static inline __attribute__ (( always_inline )) struct xfer_interface *
-filter_other_half ( struct xfer_interface *xfer ) {
- struct xfer_filter_half *half =
- container_of ( xfer, struct xfer_filter_half, xfer );
- return &half->other->xfer;
-}
-
-extern void filter_close ( struct xfer_interface *xfer, int rc );
-extern int filter_vredirect ( struct xfer_interface *xfer, int type,
- va_list args );
-extern size_t filter_window ( struct xfer_interface *xfer );
-extern struct io_buffer * filter_alloc_iob ( struct xfer_interface *xfer,
- size_t len );
-extern int filter_deliver_iob ( struct xfer_interface *xfer,
- struct io_buffer *iobuf,
- struct xfer_metadata *meta );
-extern int filter_deliver_raw ( struct xfer_interface *xfer, const void *data,
- size_t len );
-
-/**
- * Initialise a data transfer filter
- *
- * @v left "Left" half of the filter
- * @v left_op Data transfer interface operations for "left" half
- * @v right "Right" half of the filter
- * @v right_op Data transfer interface operations for "right" half
- * @v refcnt Containing object reference counter, or NULL
- */
-static inline void filter_init ( struct xfer_filter_half *left,
- struct xfer_interface_operations *left_op,
- struct xfer_filter_half *right,
- struct xfer_interface_operations *right_op,
- struct refcnt *refcnt ) {
- xfer_init ( &left->xfer, left_op, refcnt );
- xfer_init ( &right->xfer, right_op, refcnt );
- left->other = right;
- right->other = left;
-}
-
-#endif /* _IPXE_FILTER_H */
diff --git a/src/include/ipxe/http.h b/src/include/ipxe/http.h
index 97014d1f4..d8f4ca5ac 100644
--- a/src/include/ipxe/http.h
+++ b/src/include/ipxe/http.h
@@ -15,9 +15,9 @@ FILE_LICENCE ( GPL2_OR_LATER );
/** HTTPS default port */
#define HTTPS_PORT 443
-extern int http_open_filter ( struct xfer_interface *xfer, struct uri *uri,
+extern int http_open_filter ( struct interface *xfer, struct uri *uri,
unsigned int default_port,
- int ( * filter ) ( struct xfer_interface *,
- struct xfer_interface ** ) );
+ int ( * filter ) ( struct interface *,
+ struct interface ** ) );
#endif /* _IPXE_HTTP_H */
diff --git a/src/include/ipxe/ib_cmrc.h b/src/include/ipxe/ib_cmrc.h
index c02b15dcb..4f2eae69e 100644
--- a/src/include/ipxe/ib_cmrc.h
+++ b/src/include/ipxe/ib_cmrc.h
@@ -12,7 +12,7 @@ FILE_LICENCE ( BSD2 );
#include <ipxe/infiniband.h>
#include <ipxe/xfer.h>
-extern int ib_cmrc_open ( struct xfer_interface *xfer,
+extern int ib_cmrc_open ( struct interface *xfer,
struct ib_device *ibdev,
struct ib_gid *dgid,
struct ib_gid_half *service_id );
diff --git a/src/include/ipxe/iscsi.h b/src/include/ipxe/iscsi.h
index c5e725154..a604e1e4f 100644
--- a/src/include/ipxe/iscsi.h
+++ b/src/include/ipxe/iscsi.h
@@ -498,7 +498,7 @@ struct iscsi_session {
struct refcnt refcnt;
/** Transport-layer socket */
- struct xfer_interface socket;
+ struct interface socket;
/** Target address */
char *target_address;
diff --git a/src/include/ipxe/open.h b/src/include/ipxe/open.h
index 04e37e0e6..c000990c0 100644
--- a/src/include/ipxe/open.h
+++ b/src/include/ipxe/open.h
@@ -13,8 +13,8 @@ FILE_LICENCE ( GPL2_OR_LATER );
#include <ipxe/tables.h>
#include <ipxe/socket.h>
-struct xfer_interface;
struct uri;
+struct interface;
/** Location types */
enum {
@@ -53,11 +53,11 @@ struct uri_opener {
const char *scheme;
/** Open URI
*
- * @v xfer Data transfer interface
+ * @v intf Object interface
* @v uri URI
* @ret rc Return status code
*/
- int ( * open ) ( struct xfer_interface *xfer, struct uri *uri );
+ int ( * open ) ( struct interface *intf, struct uri *uri );
};
/** URI opener table */
@@ -74,12 +74,12 @@ struct socket_opener {
int family;
/** Open socket
*
- * @v xfer Data transfer interface
+ * @v intf Object interface
* @v peer Peer socket address
* @v local Local socket address, or NULL
* @ret rc Return status code
*/
- int ( * open ) ( struct xfer_interface *xfer, struct sockaddr *peer,
+ int ( * open ) ( struct interface *intf, struct sockaddr *peer,
struct sockaddr *local );
};
@@ -89,17 +89,17 @@ struct socket_opener {
/** Register a socket opener */
#define __socket_opener __table_entry ( SOCKET_OPENERS, 01 )
-extern int xfer_open_uri ( struct xfer_interface *xfer, struct uri *uri );
-extern int xfer_open_uri_string ( struct xfer_interface *xfer,
+extern int xfer_open_uri ( struct interface *intf, struct uri *uri );
+extern int xfer_open_uri_string ( struct interface *intf,
const char *uri_string );
-extern int xfer_open_named_socket ( struct xfer_interface *xfer,
- int semantics, struct sockaddr *peer,
- const char *name, struct sockaddr *local );
-extern int xfer_open_socket ( struct xfer_interface *xfer, int semantics,
+extern int xfer_open_named_socket ( struct interface *intf, int semantics,
+ struct sockaddr *peer, const char *name,
+ struct sockaddr *local );
+extern int xfer_open_socket ( struct interface *intf, int semantics,
struct sockaddr *peer, struct sockaddr *local );
-extern int xfer_vopen ( struct xfer_interface *xfer, int type, va_list args );
-extern int xfer_open ( struct xfer_interface *xfer, int type, ... );
-extern int xfer_vreopen ( struct xfer_interface *xfer, int type,
+extern int xfer_vopen ( struct interface *intf, int type, va_list args );
+extern int xfer_open ( struct interface *intf, int type, ... );
+extern int xfer_vreopen ( struct interface *intf, int type,
va_list args );
#endif /* _IPXE_OPEN_H */
diff --git a/src/include/ipxe/srp.h b/src/include/ipxe/srp.h
index 7c0ff4c93..e519838a4 100644
--- a/src/include/ipxe/srp.h
+++ b/src/include/ipxe/srp.h
@@ -832,7 +832,7 @@ struct srp_device {
struct scsi_command *command;
/** Underlying data transfer interface */
- struct xfer_interface socket;
+ struct interface socket;
/** Transport type */
struct srp_transport_type *transport;
diff --git a/src/include/ipxe/tls.h b/src/include/ipxe/tls.h
index 2cc36dd7c..94cd322c8 100644
--- a/src/include/ipxe/tls.h
+++ b/src/include/ipxe/tls.h
@@ -11,7 +11,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
#include <stdint.h>
#include <ipxe/refcnt.h>
-#include <ipxe/filter.h>
+#include <ipxe/interface.h>
#include <ipxe/process.h>
#include <ipxe/crypto.h>
#include <ipxe/md5.h>
@@ -134,9 +134,9 @@ struct tls_session {
struct refcnt refcnt;
/** Plaintext stream */
- struct xfer_filter_half plainstream;
+ struct interface plainstream;
/** Ciphertext stream */
- struct xfer_filter_half cipherstream;
+ struct interface cipherstream;
/** Current TX cipher specification */
struct tls_cipherspec tx_cipherspec;
@@ -181,7 +181,7 @@ struct tls_session {
void *rx_data;
};
-extern int add_tls ( struct xfer_interface *xfer,
- struct xfer_interface **next );
+extern int add_tls ( struct interface *xfer,
+ struct interface **next );
#endif /* _IPXE_TLS_H */
diff --git a/src/include/ipxe/udp.h b/src/include/ipxe/udp.h
index 5e55c5e8c..c18a29723 100644
--- a/src/include/ipxe/udp.h
+++ b/src/include/ipxe/udp.h
@@ -16,7 +16,8 @@ FILE_LICENCE ( GPL2_OR_LATER );
#include <ipxe/tcpip.h>
#include <ipxe/if_ether.h>
-struct xfer_interface;
+struct interface;
+struct sockaddr;
/**
* UDP constants
@@ -40,8 +41,8 @@ struct udp_header {
uint16_t chksum;
};
-extern int udp_open_promisc ( struct xfer_interface *xfer );
-extern int udp_open ( struct xfer_interface *xfer, struct sockaddr *peer,
+extern int udp_open_promisc ( struct interface *xfer );
+extern int udp_open ( struct interface *xfer, struct sockaddr *peer,
struct sockaddr *local );
#endif /* _IPXE_UDP_H */
diff --git a/src/include/ipxe/xfer.h b/src/include/ipxe/xfer.h
index 8a3f9bb1c..67da15f16 100644
--- a/src/include/ipxe/xfer.h
+++ b/src/include/ipxe/xfer.h
@@ -12,88 +12,11 @@ FILE_LICENCE ( GPL2_OR_LATER );
#include <stddef.h>
#include <stdarg.h>
#include <ipxe/interface.h>
-#include <ipxe/iobuf.h>
-struct xfer_interface;
struct xfer_metadata;
-
-/** Data transfer interface operations */
-struct xfer_interface_operations {
- /** Close interface
- *
- * @v xfer Data transfer interface
- * @v rc Reason for close
- */
- void ( * close ) ( struct xfer_interface *xfer, int rc );
- /** Redirect to new location
- *
- * @v xfer Data transfer interface
- * @v type New location type
- * @v args Remaining arguments depend upon location type
- * @ret rc Return status code
- */
- int ( * vredirect ) ( struct xfer_interface *xfer, int type,
- va_list args );
- /** Check flow control window
- *
- * @v xfer Data transfer interface
- * @ret len Length of window
- *
- * Flow control is regarded as advisory but not mandatory.
- * Users who have control over their own rate of data
- * generation should perform a flow control check before
- * generating new data. Users who have no control (such as
- * NIC drivers or filter layers) are not obliged to check.
- *
- * Data transfer interfaces must be prepared to accept
- * datagrams even if they are advertising a window of zero
- * bytes.
- */
- size_t ( * window ) ( struct xfer_interface *xfer );
- /** Allocate I/O buffer
- *
- * @v xfer Data transfer interface
- * @v len I/O buffer payload length
- * @ret iobuf I/O buffer
- */
- struct io_buffer * ( * alloc_iob ) ( struct xfer_interface *xfer,
- size_t len );
- /** Deliver datagram as I/O buffer with metadata
- *
- * @v xfer Data transfer interface
- * @v iobuf Datagram I/O buffer
- * @v meta Data transfer metadata
- * @ret rc Return status code
- *
- * A data transfer interface that wishes to support only raw
- * data delivery should set this method to
- * xfer_deliver_as_raw().
- */
- int ( * deliver_iob ) ( struct xfer_interface *xfer,
- struct io_buffer *iobuf,
- struct xfer_metadata *meta );
- /** Deliver datagram as raw data
- *
- * @v xfer Data transfer interface
- * @v data Data buffer
- * @v len Length of data buffer
- * @ret rc Return status code
- *
- * A data transfer interface that wishes to support only I/O
- * buffer delivery should set this method to
- * xfer_deliver_as_iob().
- */
- int ( * deliver_raw ) ( struct xfer_interface *xfer,
- const void *data, size_t len );
-};
-
-/** A data transfer interface */
-struct xfer_interface {
- /** Generic object communication interface */
- struct interface intf;
- /** Operations for received messages */
- struct xfer_interface_operations *op;
-};
+struct io_buffer;
+struct sockaddr;
+struct net_device;
/** Basis positions for seek() events */
enum seek_whence {
@@ -132,146 +55,40 @@ whence_text ( int whence ) {
}
}
-extern struct xfer_interface null_xfer;
-extern struct xfer_interface_operations null_xfer_ops;
+/* Data transfer interface operations */
-extern void xfer_close ( struct xfer_interface *xfer, int rc );
-extern int xfer_vredirect ( struct xfer_interface *xfer, int type,
+extern int xfer_vredirect ( struct interface *intf, int type,
va_list args );
-extern int xfer_redirect ( struct xfer_interface *xfer, int type, ... );
-extern size_t xfer_window ( struct xfer_interface *xfer );
-extern struct io_buffer * xfer_alloc_iob ( struct xfer_interface *xfer,
- size_t len );
-extern int xfer_deliver_iob ( struct xfer_interface *xfer,
- struct io_buffer *iobuf );
-extern int xfer_deliver_iob_meta ( struct xfer_interface *xfer,
- struct io_buffer *iobuf,
- struct xfer_metadata *meta );
-extern int xfer_deliver_raw ( struct xfer_interface *xfer,
- const void *data, size_t len );
-extern int xfer_vprintf ( struct xfer_interface *xfer,
- const char *format, va_list args );
-extern int __attribute__ (( format ( printf, 2, 3 ) ))
-xfer_printf ( struct xfer_interface *xfer, const char *format, ... );
-extern int xfer_seek ( struct xfer_interface *xfer, off_t offset, int whence );
-
-extern void ignore_xfer_close ( struct xfer_interface *xfer, int rc );
-extern int ignore_xfer_vredirect ( struct xfer_interface *xfer,
- int type, va_list args );
-extern size_t unlimited_xfer_window ( struct xfer_interface *xfer );
-extern size_t no_xfer_window ( struct xfer_interface *xfer );
-extern struct io_buffer * default_xfer_alloc_iob ( struct xfer_interface *xfer,
- size_t len );
-extern int xfer_deliver_as_raw ( struct xfer_interface *xfer,
- struct io_buffer *iobuf,
- struct xfer_metadata *meta );
-extern int xfer_deliver_as_iob ( struct xfer_interface *xfer,
- const void *data, size_t len );
-extern int ignore_xfer_deliver_raw ( struct xfer_interface *xfer,
- const void *data __unused, size_t len );
-
-/**
- * Initialise a data transfer interface
- *
- * @v xfer Data transfer interface
- * @v op Data transfer interface operations
- * @v refcnt Containing object reference counter, or NULL
- */
-static inline void xfer_init ( struct xfer_interface *xfer,
- struct xfer_interface_operations *op,
- struct refcnt *refcnt ) {
- xfer->intf.dest = &null_xfer.intf;
- xfer->intf.refcnt = refcnt;
- xfer->op = op;
-}
-
-/**
- * Initialise a static data transfer interface
- *
- * @v operations Data transfer interface operations
- */
-#define XFER_INIT( operations ) { \
- .intf = { \
- .dest = &null_xfer.intf, \
- .refcnt = NULL, \
- }, \
- .op = operations, \
- }
+#define xfer_vredirect_TYPE( object_type ) \
+ typeof ( int ( object_type, int type, va_list args ) )
-/**
- * Get data transfer interface from generic object communication interface
- *
- * @v intf Generic object communication interface
- * @ret xfer Data transfer interface
- */
-static inline __attribute__ (( always_inline )) struct xfer_interface *
-intf_to_xfer ( struct interface *intf ) {
- return container_of ( intf, struct xfer_interface, intf );
-}
-
-/**
- * Get reference to destination data transfer interface
- *
- * @v xfer Data transfer interface
- * @ret dest Destination interface
- */
-static inline __attribute__ (( always_inline )) struct xfer_interface *
-xfer_get_dest ( struct xfer_interface *xfer ) {
- return intf_to_xfer ( intf_get ( xfer->intf.dest ) );
-}
+extern size_t xfer_window ( struct interface *intf );
+#define xfer_window_TYPE( object_type ) \
+ typeof ( size_t ( object_type ) )
-/**
- * Drop reference to data transfer interface
- *
- * @v xfer Data transfer interface
- */
-static inline __attribute__ (( always_inline )) void
-xfer_put ( struct xfer_interface *xfer ) {
- intf_put ( &xfer->intf );
-}
-
-/**
- * Plug a data transfer interface into a new destination interface
- *
- * @v xfer Data transfer interface
- * @v dest New destination interface
- */
-static inline __attribute__ (( always_inline )) void
-xfer_plug ( struct xfer_interface *xfer, struct xfer_interface *dest ) {
- intf_plug ( &xfer->intf, &dest->intf );
-}
+extern struct io_buffer * xfer_alloc_iob ( struct interface *intf,
+ size_t len );
+#define xfer_alloc_iob_TYPE( object_type ) \
+ typeof ( struct io_buffer * ( object_type, size_t len ) )
-/**
- * Plug two data transfer interfaces together
- *
- * @v a Data transfer interface A
- * @v b Data transfer interface B
- */
-static inline __attribute__ (( always_inline )) void
-xfer_plug_plug ( struct xfer_interface *a, struct xfer_interface *b ) {
- intf_plug_plug ( &a->intf, &b->intf );
-}
+extern int xfer_deliver ( struct interface *intf,
+ struct io_buffer *iobuf,
+ struct xfer_metadata *meta );
+#define xfer_deliver_TYPE( object_type ) \
+ typeof ( int ( object_type, struct io_buffer *iobuf, \
+ struct xfer_metadata *meta ) )
-/**
- * Unplug a data transfer interface
- *
- * @v xfer Data transfer interface
- */
-static inline __attribute__ (( always_inline )) void
-xfer_unplug ( struct xfer_interface *xfer ) {
- intf_plug ( &xfer->intf, &null_xfer.intf );
-}
+/* Data transfer interface helper functions */
-/**
- * Stop using a data transfer interface
- *
- * @v xfer Data transfer interface
- *
- * After calling this method, no further messages will be received via
- * the interface.
- */
-static inline void xfer_nullify ( struct xfer_interface *xfer ) {
- xfer->op = &null_xfer_ops;
-};
+extern int xfer_redirect ( struct interface *xfer, int type, ... );
+extern int xfer_deliver_iob ( struct interface *intf,
+ struct io_buffer *iobuf );
+extern int xfer_deliver_raw ( struct interface *intf,
+ const void *data, size_t len );
+extern int xfer_vprintf ( struct interface *intf,
+ const char *format, va_list args );
+extern int __attribute__ (( format ( printf, 2, 3 ) ))
+xfer_printf ( struct interface *intf, const char *format, ... );
+extern int xfer_seek ( struct interface *intf, off_t offset, int whence );
#endif /* _IPXE_XFER_H */