xfer.h File Reference

Data transfer interfaces. More...

#include <stddef.h>
#include <stdarg.h>
#include <gpxe/interface.h>
#include <gpxe/iobuf.h>

Go to the source code of this file.

Data Structures

struct  xfer_interface_operations
 Data transfer interface operations. More...
struct  xfer_interface
 A data transfer interface. More...
struct  xfer_metadata
 Data transfer metadata. More...

Defines

#define XFER_INIT(operations)
 Initialise a static data transfer interface.

Enumerations

enum  seek_whence { SEEK_CUR = 0, SEEK_SET }
 Basis positions for seek() events. More...

Functions

 FILE_LICENCE (GPL2_OR_LATER)
static __attribute__ ((always_inline)) const char *whence_text(int whence)
 Describe seek basis.
void xfer_close (struct xfer_interface *xfer, int rc)
 Close data transfer interface.
int xfer_vredirect (struct xfer_interface *xfer, int type, va_list args)
 Send redirection event.
int xfer_redirect (struct xfer_interface *xfer, int type,...)
 Send redirection event.
size_t xfer_window (struct xfer_interface *xfer)
 Check flow control window.
struct io_bufferxfer_alloc_iob (struct xfer_interface *xfer, size_t len)
 Allocate I/O buffer.
int xfer_deliver_iob (struct xfer_interface *xfer, struct io_buffer *iobuf)
 Deliver datagram as I/O buffer with metadata.
int xfer_deliver_iob_meta (struct xfer_interface *xfer, struct io_buffer *iobuf, struct xfer_metadata *meta)
 Deliver datagram as I/O buffer with metadata.
int xfer_deliver_raw (struct xfer_interface *xfer, const void *data, size_t len)
 Deliver datagram as raw data.
int xfer_vprintf (struct xfer_interface *xfer, const char *format, va_list args)
 Deliver formatted string.
int __attribute__ ((format(printf, 2, 3))) xfer_printf(struct xfer_interface *xfer
int const char int xfer_seek (struct xfer_interface *xfer, off_t offset, int whence)
 Seek to position.
void ignore_xfer_close (struct xfer_interface *xfer, int rc)
int ignore_xfer_vredirect (struct xfer_interface *xfer, int type, va_list args)
size_t unlimited_xfer_window (struct xfer_interface *xfer)
size_t no_xfer_window (struct xfer_interface *xfer)
struct io_bufferdefault_xfer_alloc_iob (struct xfer_interface *xfer, size_t len)
int xfer_deliver_as_raw (struct xfer_interface *xfer, struct io_buffer *iobuf, struct xfer_metadata *meta)
int xfer_deliver_as_iob (struct xfer_interface *xfer, const void *data, size_t len)
 Deliver datagram as I/O buffer.
int ignore_xfer_deliver_raw (struct xfer_interface *xfer, const void *data __unused, size_t len)
 Ignore datagram as raw data event.
static void xfer_init (struct xfer_interface *xfer, struct xfer_interface_operations *op, struct refcnt *refcnt)
 Initialise a data transfer interface.

Variables

struct xfer_interface null_xfer
 Null data transfer interface.
struct xfer_interface_operations null_xfer_ops
 Null data transfer interface operations.
int const char * format


Detailed Description

Data transfer interfaces.

Definition in file xfer.h.


Define Documentation

#define XFER_INIT ( operations   ) 

Value:

{                       \
                .intf = {                               \
                        .dest = &null_xfer.intf,        \
                        .refcnt = NULL,                 \
                },                                      \
                .op = operations,                       \
        }
Initialise a static data transfer interface.

Parameters:
operations Data transfer interface operations

Definition at line 193 of file xfer.h.


Enumeration Type Documentation

Basis positions for seek() events.

Enumerator:
SEEK_CUR 
SEEK_SET 

Definition at line 99 of file xfer.h.

00099                  {
00100         SEEK_CUR = 0,
00101         SEEK_SET,
00102 };


Function Documentation

FILE_LICENCE ( GPL2_OR_LATER   ) 

static __attribute__ ( (always_inline)   )  const [inline, static]

Describe seek basis.

Plug a data transfer interface into a new destination interface.

Drop reference to data transfer interface.

Get reference to destination data transfer interface.

Get data transfer interface from generic object communication interface.

Parameters:
whence Basis for new position
intf Generic object communication interface
Return values:
xfer Data transfer interface
Parameters:
xfer Data transfer interface
Return values:
dest Destination interface
Parameters:
xfer Data transfer interface
xfer Data transfer interface
dest New destination interface

Definition at line 126 of file xfer.h.

References SEEK_CUR, and SEEK_SET.

00127                            {
00128         switch ( whence ) {
00129         case SEEK_CUR:  return "CUR";
00130         case SEEK_SET:  return "SET";
00131         default:        return "INVALID";
00132         }
00133 }

void xfer_close ( struct xfer_interface xfer,
int  rc 
)

Close data transfer interface.

Parameters:
xfer Data transfer interface
rc Reason for close

Definition at line 46 of file xfer.c.

References xfer_interface_operations::close, DBGC, dest, and xfer_interface::op.

Referenced by dhcp_finished(), dns_done(), downloader_finished(), filter_close(), ftp_done(), http_done(), hw_finished(), ib_cmrc_close(), iscsi_close_connection(), named_done(), posix_file_finished(), pxe_tftp_close(), pxenv_udp_close(), pxenv_udp_open(), slam_finished(), srp_detach(), srp_fail(), tcp_close(), tftp_done(), tftp_reopen(), tftp_reopen_mc(), tftp_timer_expired(), tls_close(), udp_close(), and xfer_vreopen().

00046                                                         {
00047         struct xfer_interface *dest = xfer_get_dest ( xfer );
00048         struct xfer_interface_operations *op = xfer->op;
00049 
00050         DBGC ( xfer, "XFER %p->%p close\n", xfer, dest );
00051 
00052         xfer_unplug ( xfer );
00053         xfer_nullify ( xfer );
00054         dest->op->close ( dest, rc );
00055         xfer->op = op;
00056         xfer_put ( dest );
00057 }

int xfer_vredirect ( struct xfer_interface xfer,
int  type,
va_list  args 
)

Send redirection event.

Parameters:
xfer Data transfer interface
type New location type
args Remaining arguments depend upon location type
Return values:
rc Return status code

Definition at line 67 of file xfer.c.

References DBGC, dest, xfer_interface::op, strerror(), and xfer_interface_operations::vredirect.

Referenced by filter_vredirect(), and xfer_redirect().

00067                                                                            {
00068         struct xfer_interface *dest = xfer_get_dest ( xfer );
00069         int rc;
00070 
00071         DBGC ( xfer, "XFER %p->%p redirect\n", xfer, dest );
00072 
00073         rc = dest->op->vredirect ( dest, type, args );
00074 
00075         if ( rc != 0 ) {
00076                 DBGC ( xfer, "XFER %p<-%p redirect: %s\n", xfer, dest,
00077                        strerror ( rc ) );
00078         }
00079         xfer_put ( dest );
00080         return rc;
00081 }

int xfer_redirect ( struct xfer_interface xfer,
int  type,
  ... 
)

Send redirection event.

Parameters:
xfer Data transfer interface
type New location type
... Remaining arguments depend upon location type
Return values:
rc Return status code

Definition at line 91 of file xfer.c.

References va_end, va_start, and xfer_vredirect().

Referenced by http_rx_location(), and named_resolv_done().

00091                                                                  {
00092         va_list args;
00093         int rc;
00094 
00095         va_start ( args, type );
00096         rc = xfer_vredirect ( xfer, type, args );
00097         va_end ( args );
00098         return rc;
00099 }

size_t xfer_window ( struct xfer_interface xfer  ) 

Check flow control window.

Parameters:
xfer Data transfer interface
Return values:
len Length of window

Definition at line 107 of file xfer.c.

References dest, xfer_interface::op, and xfer_interface_operations::window.

Referenced by filter_window(), http_step(), hw_step(), iscsi_tx_step(), pxenv_tftp_open(), tcp_xmit(), tftp_send_packet(), and tls_step().

00107                                                    {
00108         struct xfer_interface *dest = xfer_get_dest ( xfer );
00109         size_t len;
00110 
00111         len = dest->op->window ( dest );
00112 
00113         xfer_put ( dest );
00114         return len;
00115 }

struct io_buffer* xfer_alloc_iob ( struct xfer_interface xfer,
size_t  len 
) [read]

Allocate I/O buffer.

Parameters:
xfer Data transfer interface
len I/O buffer payload length
Return values:
iobuf I/O buffer

Definition at line 124 of file xfer.c.

References xfer_interface_operations::alloc_iob, DBGC, dest, and xfer_interface::op.

Referenced by dhcp_tx(), filter_alloc_iob(), iscsi_tx_data_out(), iscsi_tx_login_request(), pxenv_udp_write(), slam_tx_nack(), srp_cmd(), srp_login(), tftp_send_ack(), tftp_send_error(), tftp_send_rrq(), tls_send_plaintext(), and xfer_seek().

00124                                                                               {
00125         struct xfer_interface *dest = xfer_get_dest ( xfer );
00126         struct io_buffer *iobuf;
00127 
00128         DBGC ( xfer, "XFER %p->%p alloc_iob %zd\n", xfer, dest, len );
00129 
00130         iobuf = dest->op->alloc_iob ( dest, len );
00131 
00132         if ( ! iobuf ) {
00133                 DBGC ( xfer, "XFER %p<-%p alloc_iob failed\n", xfer, dest );
00134         }
00135         xfer_put ( dest );
00136         return iobuf;
00137 }

int xfer_deliver_iob ( struct xfer_interface xfer,
struct io_buffer iobuf 
)

Deliver datagram as I/O buffer with metadata.

Parameters:
xfer Data transfer interface
iobuf Datagram I/O buffer
Return values:
rc Return status code

Definition at line 173 of file xfer.c.

References dummy_metadata, and xfer_deliver_iob_meta().

Referenced by ftp_data_deliver_iob(), http_rx_data(), ib_cmrc_complete_recv(), iscsi_tx_data_out(), iscsi_tx_login_request(), slam_tx_nack(), srp_cmd(), srp_login(), tcp_rx_data(), tftp_send_rrq(), and tls_send_plaintext().

00174                                                  {
00175         return xfer_deliver_iob_meta ( xfer, iobuf, &dummy_metadata );
00176 }

int xfer_deliver_iob_meta ( struct xfer_interface xfer,
struct io_buffer iobuf,
struct xfer_metadata meta 
)

Deliver datagram as I/O buffer with metadata.

Parameters:
xfer Data transfer interface
iobuf Datagram I/O buffer
meta Data transfer metadata
Return values:
rc Return status code

Definition at line 147 of file xfer.c.

References DBGC, xfer_interface_operations::deliver_iob, dest, iob_len(), xfer_interface::op, and strerror().

Referenced by dhcp_tx(), filter_deliver_iob(), pxenv_udp_write(), slam_mc_socket_deliver(), tftp_rx_data(), tftp_send_ack(), tftp_send_error(), udp_rx(), xfer_deliver_iob(), and xfer_seek().

00149                                                          {
00150         struct xfer_interface *dest = xfer_get_dest ( xfer );
00151         int rc;
00152 
00153         DBGC ( xfer, "XFER %p->%p deliver_iob %zd\n", xfer, dest,
00154                iob_len ( iobuf ) );
00155 
00156         rc = dest->op->deliver_iob ( dest, iobuf, meta );
00157 
00158         if ( rc != 0 ) {
00159                 DBGC ( xfer, "XFER %p<-%p deliver_iob: %s\n", xfer, dest,
00160                        strerror ( rc ) );
00161         }
00162         xfer_put ( dest );
00163         return rc;
00164 }

int xfer_deliver_raw ( struct xfer_interface xfer,
const void *  data,
size_t  len 
)

Deliver datagram as raw data.

Parameters:
xfer Data transfer interface
iobuf Datagram I/O buffer
Return values:
rc Return status code

Definition at line 185 of file xfer.c.

References DBGC, xfer_interface_operations::deliver_raw, dest, xfer_interface::op, and strerror().

Referenced by dns_send_packet(), filter_deliver_raw(), hw_step(), ib_cmrc_changed(), iscsi_tx_bhs(), iscsi_tx_data_padding(), slam_finished(), tls_new_record(), and xfer_vprintf().

00186                                                       {
00187         struct xfer_interface *dest = xfer_get_dest ( xfer );
00188         int rc;
00189 
00190         DBGC ( xfer, "XFER %p->%p deliver_raw %p+%zd\n", xfer, dest,
00191                data, len );
00192 
00193         rc = dest->op->deliver_raw ( dest, data, len );
00194 
00195         if ( rc != 0 ) {
00196                 DBGC ( xfer, "XFER %p<-%p deliver_raw: %s\n", xfer, dest,
00197                        strerror ( rc ) );
00198         }
00199         xfer_put ( dest );
00200         return rc;
00201 }

int xfer_vprintf ( struct xfer_interface xfer,
const char *  format,
va_list  args 
)

Deliver formatted string.

Parameters:
xfer Data transfer interface
format Format string
args Arguments corresponding to the format string
Return values:
rc Return status code

Definition at line 211 of file xfer.c.

References NULL, va_copy, va_end, vsnprintf(), and xfer_deliver_raw().

Referenced by xfer_printf().

00212                                   {
00213         size_t len;
00214         va_list args_tmp;
00215 
00216         va_copy ( args_tmp, args );
00217         len = vsnprintf ( NULL, 0, format, args );
00218         {
00219                 char buf[len + 1];
00220                 vsnprintf ( buf, sizeof ( buf ), format, args_tmp );
00221                 va_end ( args_tmp );
00222                 return xfer_deliver_raw ( xfer, buf, len );
00223         }
00224 }

int __attribute__ ( (format(printf, 2, 3))   ) 

int const char int xfer_seek ( struct xfer_interface xfer,
off_t  offset,
int  whence 
)

Seek to position.

Parameters:
xfer Data transfer interface
offset Offset to new position
whence Basis for new position
Return values:
rc Return status code
Type Constraints

Definition at line 252 of file xfer.c.

References DBGC, ENOMEM, xfer_metadata::offset, xfer_alloc_iob(), and xfer_deliver_iob_meta().

Referenced by http_rx_content_length(), slam_pull_header(), and tftp_presize().

00252                                                                         {
00253         struct io_buffer *iobuf;
00254         struct xfer_metadata meta = {
00255                 .offset = offset,
00256                 .whence = whence,
00257         };
00258 
00259         DBGC ( xfer, "XFER %p seek %s+%ld\n", xfer,
00260                whence_text ( whence ), offset );
00261 
00262         /* Allocate and send a zero-length data buffer */
00263         iobuf = xfer_alloc_iob ( xfer, 0 );
00264         if ( ! iobuf )
00265                 return -ENOMEM;
00266         return xfer_deliver_iob_meta ( xfer, iobuf, &meta );
00267 }

void ignore_xfer_close ( struct xfer_interface xfer,
int  rc 
)

int ignore_xfer_vredirect ( struct xfer_interface xfer,
int  type,
va_list  args 
)

size_t unlimited_xfer_window ( struct xfer_interface xfer  ) 

size_t no_xfer_window ( struct xfer_interface xfer  ) 

struct io_buffer* default_xfer_alloc_iob ( struct xfer_interface xfer,
size_t  len 
) [read]

int xfer_deliver_as_raw ( struct xfer_interface xfer,
struct io_buffer iobuf,
struct xfer_metadata meta 
)

int xfer_deliver_as_iob ( struct xfer_interface xfer,
const void *  data,
size_t  len 
)

Deliver datagram as I/O buffer.

Parameters:
xfer Data transfer interface
data Data buffer
len Length of data buffer
Return values:
rc Return status code
This function is intended to be used as the deliver_raw() method for data transfer interfaces that prefer to handle I/O buffers.

Definition at line 372 of file xfer.c.

References xfer_interface_operations::alloc_iob, xfer_interface_operations::deliver_iob, dummy_metadata, ENOMEM, iob_put, memcpy, and xfer_interface::op.

00373                                                          {
00374         struct io_buffer *iobuf;
00375 
00376         iobuf = xfer->op->alloc_iob ( xfer, len );
00377         if ( ! iobuf )
00378                 return -ENOMEM;
00379 
00380         memcpy ( iob_put ( iobuf, len ), data, len );
00381         return xfer->op->deliver_iob ( xfer, iobuf, &dummy_metadata );
00382 }

int ignore_xfer_deliver_raw ( struct xfer_interface xfer,
const void *data  __unused,
size_t  len 
)

Ignore datagram as raw data event.

Parameters:
xfer Data transfer interface
data Data buffer
len Length of data buffer
Return values:
rc Return status code

Definition at line 392 of file xfer.c.

References DBGC, and null_xfer.

00393                                                                       {
00394         DBGC ( xfer, "XFER %p %zd bytes delivered %s\n", xfer, len,
00395                ( ( xfer == &null_xfer ) ?
00396                  "before connection" : "after termination" ) );
00397         return 0;
00398 }

static void xfer_init ( struct xfer_interface xfer,
struct xfer_interface_operations op,
struct refcnt refcnt 
) [inline, static]

Initialise a data transfer interface.

Parameters:
xfer Data transfer interface
op Data transfer interface operations
refcnt Containing object reference counter, or NULL

Definition at line 180 of file xfer.h.

References xfer_interface::intf, null_xfer, and interface::refcnt.

Referenced by create_downloader(), dns_resolv(), filter_init(), ftp_open(), http_open_filter(), hw_open(), ib_cmrc_open(), iscsi_attach(), open(), pxe_tftp_open(), slam_open(), srp_attach(), start_dhcp(), start_pxebs(), tcp_open(), tftp_core_open(), udp_open_common(), and xfer_open_named_socket().

00182                                                        {
00183         xfer->intf.dest = &null_xfer.intf;
00184         xfer->intf.refcnt = refcnt;
00185         xfer->op = op;
00186 }


Variable Documentation

Null data transfer interface.

This is the interface to which data transfer interfaces are connected when unplugged. It will never generate messages, and will silently absorb all received messages.

Definition at line 417 of file xfer.c.

Referenced by ignore_xfer_deliver_raw(), and xfer_init().

Null data transfer interface operations.

Definition at line 401 of file xfer.c.

int const char* format

Definition at line 155 of file xfer.h.


Generated on Tue Apr 6 20:01:53 2010 for gPXE by  doxygen 1.5.7.1