diff options
author | Michael Brown <mcb30@ipxe.org> | 2010-06-16 01:31:29 +0100 |
---|---|---|
committer | Michael Brown <mcb30@ipxe.org> | 2010-06-22 15:50:31 +0100 |
commit | 4327d5d39f101f1df0ace6c03f3b3ada5f6a6213 (patch) | |
tree | ccf92bdfd23046b6c7f64f87b57350f02f63ad6f /src/include | |
parent | 7b4fbd93a5f45355e4e5d30e5d34c310f6d30c05 (diff) | |
download | ipxe-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.h | 75 | ||||
-rw-r--r-- | src/include/ipxe/http.h | 6 | ||||
-rw-r--r-- | src/include/ipxe/ib_cmrc.h | 2 | ||||
-rw-r--r-- | src/include/ipxe/iscsi.h | 2 | ||||
-rw-r--r-- | src/include/ipxe/open.h | 28 | ||||
-rw-r--r-- | src/include/ipxe/srp.h | 2 | ||||
-rw-r--r-- | src/include/ipxe/tls.h | 10 | ||||
-rw-r--r-- | src/include/ipxe/udp.h | 7 | ||||
-rw-r--r-- | src/include/ipxe/xfer.h | 245 |
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 */ |