#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_buffer * | xfer_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_buffer * | default_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 |
Definition in file xfer.h.
| #define XFER_INIT | ( | operations | ) |
| enum seek_whence |
| 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.
| whence | Basis for new position | |
| intf | Generic object communication interface |
| xfer | Data transfer interface |
| xfer | Data transfer interface |
| dest | Destination interface |
| 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.
| 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 | ( | 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_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_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 __attribute__ | ( | (format(printf, 2, 3)) | ) |
| int const char 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, | |
| 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.
| 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 }
| static void xfer_init | ( | struct xfer_interface * | xfer, | |
| struct xfer_interface_operations * | op, | |||
| struct refcnt * | refcnt | |||
| ) | [inline, static] |
Initialise a data transfer interface.
| 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 }
| struct xfer_interface null_xfer |
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