#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_buffer * | xfer_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_buffer * | default_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. | |
Definition in file xfer.c.
| FILE_LICENCE | ( | GPL2_OR_LATER | ) |
| void xfer_close | ( | struct xfer_interface * | xfer, | |
| int | rc | |||
| ) |
Close data transfer interface.
| 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.
| xfer | Data transfer interface | |
| type | New location type | |
| args | Remaining arguments depend upon location type |
| 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.
| xfer | Data transfer interface | |
| type | New location type | |
| ... | Remaining arguments depend upon location type |
| 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.
| xfer | Data transfer interface |
| 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.
| xfer | Data transfer interface | |
| len | I/O buffer payload length |
| 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.
| xfer | Data transfer interface | |
| iobuf | Datagram I/O buffer | |
| meta | Data transfer metadata |
| 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.
| xfer | Data transfer interface | |
| iobuf | Datagram I/O buffer |
| 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.
| xfer | Data transfer interface | |
| iobuf | Datagram I/O buffer |
| 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.
| xfer | Data transfer interface | |
| format | Format string | |
| args | Arguments corresponding to the format string |
| 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.
| xfer | Data transfer interface | |
| format | Format string | |
| ... | Arguments corresponding to the format string |
| 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.
| xfer | Data transfer interface | |
| offset | Offset to new position | |
| whence | Basis for new position |
| 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 | |||
| ) |
| int ignore_xfer_vredirect | ( | struct xfer_interface *xfer | __unused, | |
| int type | __unused, | |||
| va_list args | __unused | |||
| ) |
| size_t unlimited_xfer_window | ( | struct xfer_interface *xfer | __unused | ) |
| size_t no_xfer_window | ( | struct xfer_interface *xfer | __unused | ) |
| struct io_buffer* default_xfer_alloc_iob | ( | struct xfer_interface *xfer | __unused, | |
| size_t | len | |||
| ) | [read] |
Allocate I/O buffer.
| xfer | Data transfer interface | |
| len | I/O buffer payload length |
| 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.
| xfer | Data transfer interface | |
| iobuf | Datagram I/O buffer | |
| meta | Data transfer metadata |
| rc | Return status code |
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.
| xfer | Data transfer interface | |
| data | Data buffer | |
| len | Length of data buffer |
| rc | Return status code |
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.
| xfer | Data transfer interface | |
| data | Data buffer | |
| len | Length of data buffer |
| 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 }
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,
}
| 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().
1.5.7.1