iPXE
xfer.h File Reference

Data transfer interfaces. More...

#include <stddef.h>
#include <stdarg.h>
#include <ipxe/interface.h>

Go to the source code of this file.

Data Structures

 Data transfer metadata. More...

Macros

#define XFER_FL_ABS_OFFSET   0x0001
 Offset is absolute.
#define XFER_FL_OVER   0x0002
 Sender is relinquishing use of half-duplex channel.
#define XFER_FL_OUT   0x0004
 This is the final data transfer.
#define XFER_FL_CMD_STAT   0x0008
 Data content represents a command or status message.
#define XFER_FL_RESPONSE   0x0010
 Data content is a response.
#define xfer_vredirect_TYPE(object_type)
#define xfer_window_TYPE(object_type)
#define xfer_window_changed_TYPE(object_type)
#define xfer_alloc_iob_TYPE(object_type)
#define xfer_deliver_TYPE(object_type)

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 FILE_SECBOOT (PERMITTED)
int xfer_vredirect (struct interface *intf, int type, va_list args)
 Send redirection event.
size_t xfer_window (struct interface *intf)
 Check flow control window.
void xfer_window_changed (struct interface *intf)
 Report change of flow control window.
struct io_bufferxfer_alloc_iob (struct interface *intf, size_t len)
 Allocate I/O buffer.
int xfer_deliver (struct interface *intf, struct io_buffer *iobuf, struct xfer_metadata *meta)
 Deliver datagram.
int xfer_redirect (struct interface *xfer, int type,...)
 Send redirection event.
int xfer_deliver_iob (struct interface *intf, struct io_buffer *iobuf)
 Deliver datagram as I/O buffer without metadata.
int xfer_deliver_raw_meta (struct interface *intf, const void *data, size_t len, struct xfer_metadata *meta)
 Deliver datagram as raw data.
int xfer_deliver_raw (struct interface *intf, const void *data, size_t len)
 Deliver datagram as raw data without metadata.
int xfer_vprintf (struct interface *intf, const char *format, va_list args)
 Deliver formatted string.
int __attribute__ ((format(printf, 2, 3))) xfer_printf(struct interface *intf
int const char int xfer_seek (struct interface *intf, off_t offset)
 Seek to position.
int xfer_check_order (struct xfer_metadata *meta, size_t *pos, size_t len)
 Check that data is delivered strictly in order.

Variables

int const char * format

Detailed Description

Data transfer interfaces.

Definition in file xfer.h.

Macro Definition Documentation

◆ XFER_FL_ABS_OFFSET

◆ XFER_FL_OVER

#define XFER_FL_OVER   0x0002

Sender is relinquishing use of half-duplex channel.

Definition at line 51 of file xfer.h.

Referenced by fc_els_tx(), fc_ns_query_step(), fc_xchg_rx(), fc_xchg_tx(), fcpcmd_send_cmnd(), and fcpcmd_send_wrdata().

◆ XFER_FL_OUT

#define XFER_FL_OUT   0x0004

This is the final data transfer.

Definition at line 54 of file xfer.h.

Referenced by fc_els_tx(), fc_xchg_rx(), and fc_xchg_tx().

◆ XFER_FL_CMD_STAT

#define XFER_FL_CMD_STAT   0x0008

Data content represents a command or status message.

The flag XFER_FL_RESPONSE is used to distinguish between a command message and a status message.

Definition at line 61 of file xfer.h.

Referenced by fc_xchg_tx(), fcpcmd_deliver(), and fcpcmd_send_cmnd().

◆ XFER_FL_RESPONSE

#define XFER_FL_RESPONSE   0x0010

Data content is a response.

Definition at line 64 of file xfer.h.

Referenced by fc_els_tx(), fc_xchg_tx(), fcpcmd_deliver(), and fcpcmd_send_wrdata().

◆ xfer_vredirect_TYPE

#define xfer_vredirect_TYPE ( object_type)
Value:
typeof ( int ( object_type, int type, va_list args ) )
typeof(acpi_finder=acpi_find)
ACPI table finder.
Definition acpi.c:48
uint32_t type
Operating system type.
Definition ena.h:1
__builtin_va_list va_list
Definition stdarg.h:7

Definition at line 70 of file xfer.h.

70#define xfer_vredirect_TYPE( object_type ) \
71 typeof ( int ( object_type, int type, va_list args ) )

Referenced by xfer_vredirect().

◆ xfer_window_TYPE

#define xfer_window_TYPE ( object_type)
Value:
typeof ( size_t ( object_type ) )

Definition at line 74 of file xfer.h.

74#define xfer_window_TYPE( object_type ) \
75 typeof ( size_t ( object_type ) )

Referenced by xfer_window().

◆ xfer_window_changed_TYPE

#define xfer_window_changed_TYPE ( object_type)
Value:
typeof ( void ( object_type ) )

Definition at line 78 of file xfer.h.

78#define xfer_window_changed_TYPE( object_type ) \
79 typeof ( void ( object_type ) )

◆ xfer_alloc_iob_TYPE

#define xfer_alloc_iob_TYPE ( object_type)
Value:
typeof ( struct io_buffer * ( object_type, size_t len ) )
ring len
Length.
Definition dwmac.h:226
A persistent I/O buffer.
Definition iobuf.h:38

Definition at line 83 of file xfer.h.

83#define xfer_alloc_iob_TYPE( object_type ) \
84 typeof ( struct io_buffer * ( object_type, size_t len ) )

Referenced by xfer_alloc_iob().

◆ xfer_deliver_TYPE

#define xfer_deliver_TYPE ( object_type)
Value:
typeof ( int ( object_type, struct io_buffer *iobuf, \
struct xfer_metadata *meta ) )
uint8_t meta
Metadata flags.
Definition ena.h:3
Data transfer metadata.
Definition xfer.h:23

Definition at line 89 of file xfer.h.

89#define xfer_deliver_TYPE( object_type ) \
90 typeof ( int ( object_type, struct io_buffer *iobuf, \
91 struct xfer_metadata *meta ) )

Referenced by xfer_deliver().

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )

◆ FILE_SECBOOT()

FILE_SECBOOT ( PERMITTED )

◆ xfer_vredirect()

int xfer_vredirect ( struct interface * intf,
int type,
va_list args )
extern

Send redirection event.

Parameters
intfData transfer interface
typeNew location type
argsRemaining arguments depend upon location type
Return values
rcReturn status code

Definition at line 63 of file xfer.c.

63 {
64 struct interface tmp;
65 struct interface *dest;
66 xfer_vredirect_TYPE ( void * ) *op =
68 void *object = intf_object ( dest );
69 int rc;
70
71 DBGC ( INTF_COL ( intf ), "INTF " INTF_INTF_FMT " redirect\n",
72 INTF_INTF_DBG ( intf, dest ) );
73
74 if ( op ) {
75 rc = op ( object, type, args );
76 } else {
77 /* Default is to reopen the interface as instructed,
78 * then send xfer_window_changed() messages to both
79 * new child and parent interfaces. Since our
80 * original child interface is likely to be closed and
81 * unplugged as a result of the call to
82 * xfer_vreopen(), we create a temporary interface in
83 * order to be able to send xfer_window_changed() to
84 * the parent.
85 *
86 * If redirection fails, then send intf_close() to the
87 * parent interface.
88 */
90 intf_plug ( &tmp, dest );
91 rc = xfer_vreopen ( dest, type, args );
92 if ( rc == 0 ) {
95 } else {
96 intf_close ( &tmp, rc );
97 }
98 intf_unplug ( &tmp );
99 }
100
101 if ( rc != 0 ) {
102 DBGC ( INTF_COL ( intf ), "INTF " INTF_INTF_FMT " redirect "
103 "failed: %s\n", INTF_INTF_DBG ( intf, dest ),
104 strerror ( rc ) );
105 }
106
107 intf_put ( dest );
108 return rc;
109}
struct arbelprm_rc_send_wqe rc
Definition arbel.h:3
if(len >=6 *4) __asm__ __volatile__("movsl" if(len >=5 *4) __asm__ __volatile__("movsl" if(len >=4 *4) __asm__ __volatile__("movsl" if(len >=3 *4) __asm__ __volatile__("movsl" if(len >=2 *4) __asm__ __volatile__("movsl" if(len >=1 *4) __asm__ __volatile__("movsl" if((len % 4) >=2) __asm__ __volatile__("movsw" if((len % 2) >=1) __asm__ __volatile__("movsb" retur dest)
Definition string.h:151
#define DBGC(...)
Definition compiler.h:505
void intf_close(struct interface *intf, int rc)
Close an object interface.
Definition interface.c:250
void * intf_object(struct interface *intf)
Get pointer to object containing object interface.
Definition interface.c:160
void intf_plug(struct interface *intf, struct interface *dest)
Plug an object interface into a new destination object interface.
Definition interface.c:84
void intf_put(struct interface *intf)
Decrement reference count on an object interface.
Definition interface.c:150
void intf_unplug(struct interface *intf)
Unplug an object interface.
Definition interface.c:118
static void intf_temp_init(struct interface *intf, struct interface *original)
Initialise a temporary outbound-only object interface.
Definition interface.h:233
#define intf_get_dest_op_no_passthru(intf, type, dest)
Get object interface destination and operation method (without pass-through)
Definition interface.h:258
#define INTF_INTF_FMT
printf() format string for INTF_INTF_DBG()
Definition interface.h:298
#define INTF_COL(intf)
Find debugging colourisation for an object interface.
Definition interface.h:282
#define INTF_INTF_DBG(intf, dest)
printf() arguments for representing an object interface pair
Definition interface.h:307
unsigned long tmp
Definition linux_pci.h:65
static uint16_t struct vmbus_xfer_pages_operations * op
Definition netvsc.h:327
int xfer_vreopen(struct interface *intf, int type, va_list args)
Reopen location.
Definition open.c:225
char * strerror(int errno)
Retrieve string representation of error number.
Definition strerror.c:79
An object interface.
Definition interface.h:125
struct interface * intf
Original interface.
Definition interface.h:159
void xfer_window_changed(struct interface *intf)
Report change of flow control window.
Definition xfer.c:147
int xfer_vredirect(struct interface *intf, int type, va_list args)
Send redirection event.
Definition xfer.c:63
#define xfer_vredirect_TYPE(object_type)
Definition xfer.h:70

References DBGC, dest, interface::intf, intf_close(), INTF_COL, intf_get_dest_op_no_passthru, INTF_INTF_DBG, INTF_INTF_FMT, intf_object(), intf_plug(), intf_put(), intf_temp_init(), intf_unplug(), op, rc, strerror(), tmp, type, xfer_vredirect(), xfer_vredirect_TYPE, xfer_vreopen(), and xfer_window_changed().

Referenced by xfer_redirect(), and xfer_vredirect().

◆ xfer_window()

size_t xfer_window ( struct interface * intf)
extern

Check flow control window.

Parameters
intfData transfer interface
Return values
lenLength of window

Definition at line 117 of file xfer.c.

117 {
118 struct interface *dest;
119 xfer_window_TYPE ( void * ) *op =
121 void *object = intf_object ( dest );
122 size_t len;
123
124 if ( op ) {
125 len = op ( object );
126 } else {
127 /* Default is to provide an unlimited window */
128 len = ~( ( size_t ) 0 );
129 }
130
131 intf_put ( dest );
132 return len;
133}
__SIZE_TYPE__ size_t
Definition stdint.h:6
#define intf_get_dest_op(intf, type, dest)
Get object interface destination and operation method.
Definition interface.h:270
size_t xfer_window(struct interface *intf)
Check flow control window.
Definition xfer.c:117
#define xfer_window_TYPE(object_type)
Definition xfer.h:74

References dest, interface::intf, intf_get_dest_op, intf_object(), intf_put(), len, op, xfer_window(), and xfer_window_TYPE.

Referenced by efi_local_step(), fc_port_window_changed(), fcpcmd_send_wrdata(), http_step(), hw_step(), ipair_window_changed(), iscsi_tx_step(), nfs_mount_step(), nfs_pm_step(), nfs_step(), pinger_window_changed(), pxenv_tftp_open(), sanpath_step(), scsidev_step(), scsidev_window(), syslogs_window_changed(), tcp_xmit_sack(), tftp_send_packet(), tftp_send_rrq(), tls_cipherstream_window(), tls_plainstream_window(), tls_tx_step(), xcm_step(), and xfer_window().

◆ xfer_window_changed()

void xfer_window_changed ( struct interface * intf)
extern

Report change of flow control window.

Parameters
intfData transfer interface

Note that this method is used to indicate only unsolicited changes in the flow control window. In particular, this method must not be called as part of the response to xfer_deliver(), since that could easily lead to an infinite loop. Callers of xfer_deliver() should assume that the flow control window will have changed without generating an xfer_window_changed() message.

Definition at line 147 of file xfer.c.

147 {
148
150}
void intf_poke(struct interface *intf, void(type)(struct interface *intf))
Poke an object interface.
Definition interface.c:421

References interface::intf, intf_poke(), and xfer_window_changed().

Referenced by aoedev_config_done(), fcoe_expired(), fcoe_reset(), fcpdev_examine(), http_step(), ib_cmrc_changed(), iscsi_rx_login_response(), scsidev_ready(), srp_login_rsp(), tcp_rx(), tls_new_finished(), tls_tx_step(), xfer_vredirect(), and xfer_window_changed().

◆ xfer_alloc_iob()

struct io_buffer * xfer_alloc_iob ( struct interface * intf,
size_t len )
extern

Allocate I/O buffer.

Parameters
intfData transfer interface
lenI/O buffer payload length
Return values
iobufI/O buffer

Definition at line 159 of file xfer.c.

159 {
160 struct interface *dest;
161 xfer_alloc_iob_TYPE ( void * ) *op =
163 void *object = intf_object ( dest );
164 struct io_buffer *iobuf;
165
166 DBGC ( INTF_COL ( intf ), "INTF " INTF_INTF_FMT " alloc_iob %zd\n",
167 INTF_INTF_DBG ( intf, dest ), len );
168
169 if ( op ) {
170 iobuf = op ( object, len );
171 } else {
172 /* Default is to allocate an I/O buffer with no
173 * reserved space.
174 */
175 iobuf = alloc_iob ( len );
176 }
177
178 if ( ! iobuf ) {
179 DBGC ( INTF_COL ( intf ), "INTF " INTF_INTF_FMT " alloc_iob "
180 "failed\n", INTF_INTF_DBG ( intf, dest ) );
181 }
182
183 intf_put ( dest );
184 return iobuf;
185}
struct io_buffer * alloc_iob(size_t len)
Allocate I/O buffer.
Definition iobuf.c:131
struct io_buffer * xfer_alloc_iob(struct interface *intf, size_t len)
Allocate I/O buffer.
Definition xfer.c:159
#define xfer_alloc_iob_TYPE(object_type)
Definition xfer.h:83

References alloc_iob(), DBGC, dest, interface::intf, INTF_COL, intf_get_dest_op, INTF_INTF_DBG, INTF_INTF_FMT, intf_object(), intf_put(), len, op, xfer_alloc_iob(), and xfer_alloc_iob_TYPE.

Referenced by dhcp_tx(), dhcpv6_tx(), efi_local_step(), efi_pxe_udp_write(), fc_xchg_alloc_iob(), fcpcmd_send_cmnd(), fcpcmd_send_wrdata(), http_tx_request(), ipair_tx(), iscsi_tx_data_out(), iscsi_tx_login_request(), oncrpc_call(), pinger_expired(), pxenv_udp_write(), slam_tx_nack(), srp_cmd(), srp_login(), tftp_send_ack(), tftp_send_error(), tftp_send_rrq(), tls_alloc_iob(), xfer_alloc_iob(), xfer_deliver_raw_meta(), and xfer_seek().

◆ xfer_deliver()

int xfer_deliver ( struct interface * intf,
struct io_buffer * iobuf,
struct xfer_metadata * meta )
extern

Deliver datagram.

Parameters
intfData transfer interface
iobufDatagram I/O buffer
metaData transfer metadata
Return values
rcReturn status code

Definition at line 195 of file xfer.c.

197 {
198 struct interface *dest;
199 xfer_deliver_TYPE ( void * ) *op =
201 void *object = intf_object ( dest );
202 int rc;
203
204 DBGC ( INTF_COL ( intf ), "INTF " INTF_INTF_FMT " deliver %zd\n",
205 INTF_INTF_DBG ( intf, dest ), iob_len ( iobuf ) );
206
207 if ( op ) {
208 rc = op ( object, iobuf, meta );
209 } else {
210 /* Default is to discard the I/O buffer */
211 free_iob ( iobuf );
212 rc = -EPIPE;
213 }
214
215 if ( rc != 0 ) {
216 DBGC ( INTF_COL ( intf ), "INTF " INTF_INTF_FMT
217 " deliver failed: %s\n",
218 INTF_INTF_DBG ( intf, dest ), strerror ( rc ) );
219 }
220
221 intf_put ( dest );
222 return rc;
223}
#define EPIPE
Broken pipe.
Definition errno.h:620
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
Definition iobuf.c:153
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition iobuf.h:160
int xfer_deliver(struct interface *intf, struct io_buffer *iobuf, struct xfer_metadata *meta)
Deliver datagram.
Definition xfer.c:195
#define xfer_deliver_TYPE(object_type)
Definition xfer.h:89

References DBGC, dest, EPIPE, free_iob(), interface::intf, INTF_COL, intf_get_dest_op, INTF_INTF_DBG, INTF_INTF_FMT, intf_object(), intf_put(), iob_len(), meta, op, rc, strerror(), xfer_deliver(), and xfer_deliver_TYPE.

Referenced by dhcp_tx(), efi_pxe_udp_write(), fc_xchg_rx(), fcpcmd_send_cmnd(), fcpcmd_send_wrdata(), http_conn_socket_deliver(), http_content_deliver(), peerblk_deliver(), peermux_block_deliver(), ping_rx(), pinger_expired(), pxenv_udp_write(), slam_mc_socket_deliver(), tftp_rx_data(), tftp_send_ack(), tftp_send_error(), udp_rx(), xfer_buffer(), xfer_deliver(), xfer_deliver_iob(), xfer_deliver_raw_meta(), and xfer_seek().

◆ xfer_redirect()

int xfer_redirect ( struct interface * intf,
int type,
... )
extern

Send redirection event.

Parameters
intfData transfer interface
typeNew location type
...Remaining arguments depend upon location type
Return values
rcReturn status code

Definition at line 239 of file xfer.c.

239 {
240 va_list args;
241 int rc;
242
243 va_start ( args, type );
244 rc = xfer_vredirect ( intf, type, args );
245 va_end ( args );
246 return rc;
247}
#define va_end(ap)
Definition stdarg.h:10
#define va_start(ap, last)
Definition stdarg.h:8

References interface::intf, rc, type, va_end, va_start, and xfer_vredirect().

Referenced by http_redirect(), and named_resolv_done().

◆ xfer_deliver_iob()

int xfer_deliver_iob ( struct interface * intf,
struct io_buffer * iobuf )
extern

Deliver datagram as I/O buffer without metadata.

Parameters
intfData transfer interface
iobufDatagram I/O buffer
Return values
rcReturn status code

Definition at line 256 of file xfer.c.

256 {
257 return xfer_deliver ( intf, iobuf, &dummy_metadata );
258}
static struct xfer_metadata dummy_metadata
Dummy transfer metadata.
Definition xfer.c:47

References dummy_metadata, interface::intf, and xfer_deliver().

Referenced by dhcpv6_tx(), efi_local_step(), fc_xchg_tx(), fcoe_rx(), http_rx_chunk_data(), http_rx_transfer_identity(), http_tx_request(), ib_cmrc_complete_recv(), imux_rx_tcp(), ipair_tx(), iscsi_tx_data_out(), iscsi_tx_login_request(), nfs_deliver(), oncrpc_call(), slam_tx_nack(), srp_cmd(), srp_login(), tcp_rx_data(), tftp_send_rrq(), tls_new_data(), and tls_send_record().

◆ xfer_deliver_raw_meta()

int xfer_deliver_raw_meta ( struct interface * intf,
const void * data,
size_t len,
struct xfer_metadata * meta )
extern

Deliver datagram as raw data.

Parameters
intfData transfer interface
dataData
lenLength of data
metaData transfer metadata
Return values
rcReturn status code

Definition at line 269 of file xfer.c.

270 {
271 struct io_buffer *iobuf;
272
273 iobuf = xfer_alloc_iob ( intf, len );
274 if ( ! iobuf )
275 return -ENOMEM;
276
277 memcpy ( iob_put ( iobuf, len ), data, len );
278 return xfer_deliver ( intf, iobuf, meta );
279}
uint8_t data[48]
Additional event data.
Definition ena.h:11
#define ENOMEM
Not enough space.
Definition errno.h:535
void * memcpy(void *dest, const void *src, size_t len) __nonnull
#define iob_put(iobuf, len)
Definition iobuf.h:125

References data, ENOMEM, iob_put, len, memcpy(), meta, xfer_alloc_iob(), and xfer_deliver().

Referenced by dns_send_packet(), fc_els_tx(), fc_ns_query_step(), peerdisc_socket_tx(), and xfer_deliver_raw().

◆ xfer_deliver_raw()

int xfer_deliver_raw ( struct interface * intf,
const void * data,
size_t len )
extern

Deliver datagram as raw data without metadata.

Parameters
intfData transfer interface
dataData
lenLength of data
Return values
rcReturn status code

Definition at line 289 of file xfer.c.

289 {
290 return xfer_deliver_raw_meta ( intf, data, len, &dummy_metadata );
291}
int xfer_deliver_raw_meta(struct interface *intf, const void *data, size_t len, struct xfer_metadata *meta)
Deliver datagram as raw data.
Definition xfer.c:269

References data, dummy_metadata, len, and xfer_deliver_raw_meta().

Referenced by fcoe_fip_rx_els_response(), hw_step(), ib_cmrc_changed(), iscsi_tx_bhs(), ntp_request(), slam_finished(), xcm_step(), xfer_vprintf(), xsmp_tx_session(), and xsmp_tx_xve().

◆ xfer_vprintf()

int xfer_vprintf ( struct interface * intf,
const char * format,
va_list args )
extern

Deliver formatted string.

Parameters
intfData transfer interface
formatFormat string
argsArguments corresponding to the format string
Return values
rcReturn status code

Definition at line 301 of file xfer.c.

302 {
303 va_list args_tmp;
304 char *buf;
305 int len;
306 int rc;
307
308 /* Create temporary string */
309 va_copy ( args_tmp, args );
310 len = vasprintf ( &buf, format, args );
311 va_end ( args_tmp );
312 if ( len < 0 ) {
313 rc = len;
314 goto err_asprintf;
315 }
316
317 /* Transmit string */
318 if ( ( rc = xfer_deliver_raw ( intf, buf, len ) ) != 0 )
319 goto err_deliver;
320
321 err_deliver:
322 free ( buf );
323 err_asprintf:
324 return rc;
325}
int vasprintf(char **strp, const char *fmt, va_list args)
Write a formatted string to newly allocated memory.
Definition asprintf.c:18
static void(* free)(struct refcnt *refcnt))
Definition refcnt.h:55
#define va_copy(dest, src)
Definition stdarg.h:11
int xfer_deliver_raw(struct interface *intf, const void *data, size_t len)
Deliver datagram as raw data without metadata.
Definition xfer.c:289
int const char * format
Definition xfer.h:105

References format, free, len, rc, va_copy, va_end, vasprintf(), and xfer_deliver_raw().

Referenced by xfer_printf().

◆ __attribute__()

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

References format, and printf().

◆ xfer_seek()

int const char int xfer_seek ( struct interface * intf,
off_t offset )
extern

Seek to position.

Parameters
intfData transfer interface
offsetOffset to new position
Return values
rcReturn status code

Definition at line 352 of file xfer.c.

352 {
353 struct io_buffer *iobuf;
354 struct xfer_metadata meta = {
355 .flags = XFER_FL_ABS_OFFSET,
356 .offset = offset,
357 };
358
359 DBGC ( INTF_COL ( intf ), "INTF " INTF_FMT " seek to %ld\n",
360 INTF_DBG ( intf ), offset );
361
362 /* Allocate and send a zero-length data buffer */
363 iobuf = xfer_alloc_iob ( intf, 0 );
364 if ( ! iobuf )
365 return -ENOMEM;
366
367 return xfer_deliver ( intf, iobuf, &meta );
368}
uint16_t offset
Offset to command line.
Definition bzimage.h:3
#define INTF_DBG(intf)
printf() arguments for representing an object interface
Definition interface.h:293
#define INTF_FMT
printf() format string for INTF_DBG()
Definition interface.h:285
#define XFER_FL_ABS_OFFSET
Offset is absolute.
Definition xfer.h:48

References DBGC, ENOMEM, INTF_COL, INTF_DBG, INTF_FMT, meta, offset, xfer_alloc_iob(), xfer_deliver(), and XFER_FL_ABS_OFFSET.

Referenced by efi_local_step(), ftp_reply(), http_rx_chunk_len(), http_rx_headers(), nfs_deliver(), peermux_info_close(), slam_pull_header(), and tftp_presize().

◆ xfer_check_order()

int xfer_check_order ( struct xfer_metadata * meta,
size_t * pos,
size_t len )
extern

Check that data is delivered strictly in order.

Parameters
metaData transfer metadata
posCurrent position
lenLength of data
Return values
rcReturn status code

Definition at line 378 of file xfer.c.

378 {
379 size_t new_pos;
380
381 /* Allow out-of-order zero-length packets (as used by xfer_seek()) */
382 if ( len == 0 )
383 return 0;
384
385 /* Calculate position of this delivery */
386 new_pos = *pos;
387 if ( meta->flags & XFER_FL_ABS_OFFSET )
388 new_pos = 0;
389 new_pos += meta->offset;
390
391 /* Fail if delivery position is not equal to current position */
392 if ( new_pos != *pos )
393 return -EPROTO;
394
395 /* Update current position */
396 *pos += len;
397
398 return 0;
399}
#define EPROTO
Protocol error.
Definition errno.h:625

References EPROTO, len, meta, and XFER_FL_ABS_OFFSET.

Referenced by peerblk_raw_rx().

Variable Documentation

◆ format