xfer.c File Reference

Data transfer interfaces. More...

#include <string.h>
#include <stdio.h>
#include <errno.h>
#include <gpxe/xfer.h>

Go to the source code of this file.

Functions

 FILE_LICENCE (GPL2_OR_LATER)
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_meta (struct xfer_interface *xfer, struct io_buffer *iobuf, struct xfer_metadata *meta)
 Deliver datagram as I/O buffer with metadata.
int xfer_deliver_iob (struct xfer_interface *xfer, struct io_buffer *iobuf)
 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 xfer_printf (struct xfer_interface *xfer, const char *format,...)
 Deliver formatted string.
int xfer_seek (struct xfer_interface *xfer, off_t offset, int whence)
 Seek to position.
void ignore_xfer_close (struct xfer_interface *xfer __unused, int rc __unused)
 Ignore close() event.
int ignore_xfer_vredirect (struct xfer_interface *xfer __unused, int type __unused, va_list args __unused)
 Ignore vredirect() event.
size_t unlimited_xfer_window (struct xfer_interface *xfer __unused)
 Unlimited flow control window.
size_t no_xfer_window (struct xfer_interface *xfer __unused)
 No flow control window.
struct io_bufferdefault_xfer_alloc_iob (struct xfer_interface *xfer __unused, size_t len)
 Allocate I/O buffer.
int xfer_deliver_as_raw (struct xfer_interface *xfer, struct io_buffer *iobuf, struct xfer_metadata *meta __unused)
 Deliver datagram as raw data.
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.

Variables

static struct xfer_metadata dummy_metadata
 Dummy transfer metadata.
struct xfer_interface_operations null_xfer_ops
 Null data transfer interface operations.
struct xfer_interface null_xfer = XFER_INIT ( &null_xfer_ops )
 Null data transfer interface.


Detailed Description

Data transfer interfaces.

Definition in file xfer.c.


Function Documentation

FILE_LICENCE ( GPL2_OR_LATER   ) 

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_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_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_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 xfer_printf ( struct xfer_interface xfer,
const char *  format,
  ... 
)

Deliver formatted string.

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

Definition at line 234 of file xfer.c.

References va_end, va_start, and xfer_vprintf().

Referenced by ftp_next_state(), and http_step().

00234                                                                          {
00235         va_list args;
00236         int rc;
00237 
00238         va_start ( args, format );
00239         rc = xfer_vprintf ( xfer, format, args );
00240         va_end ( args );
00241         return rc;
00242 }

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

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  __unused,
int rc  __unused 
)

Ignore close() event.

Parameters:
xfer Data transfer interface
rc Reason for close

Definition at line 284 of file xfer.c.

00285                                            {
00286         /* Nothing to do */
00287 }

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

Ignore vredirect() 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 297 of file xfer.c.

00298                                                                        {
00299         return 0;
00300 }

size_t unlimited_xfer_window ( struct xfer_interface *xfer  __unused  ) 

Unlimited flow control window.

Parameters:
xfer Data transfer interface
Return values:
len Length of window
This handler indicates that the interface is always ready to accept data.

Definition at line 311 of file xfer.c.

00311                                                                       {
00312         return ~( ( size_t ) 0 );
00313 }

size_t no_xfer_window ( struct xfer_interface *xfer  __unused  ) 

No flow control window.

Parameters:
xfer Data transfer interface
Return values:
len Length of window
This handler indicates that the interface is never ready to accept data.

Definition at line 324 of file xfer.c.

00324                                                                {
00325         return 0;
00326 }

struct io_buffer* default_xfer_alloc_iob ( struct xfer_interface *xfer  __unused,
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 336 of file xfer.c.

References alloc_iob().

00336                                                                             {
00337         return alloc_iob ( len );
00338 }

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

Deliver datagram as raw data.

Parameters:
xfer Data transfer interface
iobuf Datagram I/O buffer
meta Data transfer metadata
Return values:
rc Return status code
This function is intended to be used as the deliver() method for data transfer interfaces that prefer to handle raw data.

Definition at line 351 of file xfer.c.

References io_buffer::data, xfer_interface_operations::deliver_raw, free_iob(), iob_len(), and xfer_interface::op.

00353                                                                 {
00354         int rc;
00355 
00356         rc = xfer->op->deliver_raw ( xfer, iobuf->data, iob_len ( iobuf ) );
00357         free_iob ( iobuf );
00358         return rc;
00359 }

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 }


Variable Documentation

struct xfer_metadata dummy_metadata [static]

Dummy transfer metadata.

This gets passed to xfer_interface::deliver_iob() and equivalents when no metadata is available.

Definition at line 38 of file xfer.c.

Referenced by xfer_deliver_as_iob(), and xfer_deliver_iob().

Initial value:

 {
        .close          = ignore_xfer_close,
        .vredirect      = ignore_xfer_vredirect,
        .window         = unlimited_xfer_window,
        .alloc_iob      = default_xfer_alloc_iob,
        .deliver_iob    = xfer_deliver_as_raw,
        .deliver_raw    = ignore_xfer_deliver_raw,
}
Null data transfer interface operations.

Definition at line 401 of file xfer.c.

struct xfer_interface null_xfer = XFER_INIT ( &null_xfer_ops )

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().


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