iPXE
Functions | Variables
xfer.c File Reference

Data transfer interfaces. More...

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <ipxe/iobuf.h>
#include <ipxe/xfer.h>
#include <ipxe/open.h>

Go to the source code of this file.

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. More...
 
size_t xfer_window (struct interface *intf)
 Check flow control window. More...
 
void xfer_window_changed (struct interface *intf)
 Report change of flow control window. More...
 
struct io_bufferxfer_alloc_iob (struct interface *intf, size_t len)
 Allocate I/O buffer. More...
 
int xfer_deliver (struct interface *intf, struct io_buffer *iobuf, struct xfer_metadata *meta)
 Deliver datagram. More...
 
int xfer_redirect (struct interface *intf, int type,...)
 Send redirection event. More...
 
int xfer_deliver_iob (struct interface *intf, struct io_buffer *iobuf)
 Deliver datagram as I/O buffer without metadata. More...
 
int xfer_deliver_raw_meta (struct interface *intf, const void *data, size_t len, struct xfer_metadata *meta)
 Deliver datagram as raw data. More...
 
int xfer_deliver_raw (struct interface *intf, const void *data, size_t len)
 Deliver datagram as raw data without metadata. More...
 
int xfer_vprintf (struct interface *intf, const char *format, va_list args)
 Deliver formatted string. More...
 
int xfer_printf (struct interface *intf, const char *format,...)
 Deliver formatted string. More...
 
int xfer_seek (struct interface *intf, off_t offset)
 Seek to position. More...
 
int xfer_check_order (struct xfer_metadata *meta, size_t *pos, size_t len)
 Check that data is delivered strictly in order. More...
 

Variables

static struct xfer_metadata dummy_metadata
 Dummy transfer metadata. More...
 

Detailed Description

Data transfer interfaces.

Definition in file xfer.c.

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 
)

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  */
89  intf_temp_init ( &tmp, intf );
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:14
void xfer_window_changed(struct interface *intf)
Report change of flow control window.
Definition: xfer.c:147
void intf_close(struct interface *intf, int rc)
Close an object interface.
Definition: interface.c:250
#define INTF_INTF_FMT
printf() format string for INTF_INTF_DBG()
Definition: interface.h:298
#define INTF_INTF_DBG(intf, dest)
printf() arguments for representing an object interface pair
Definition: interface.h:307
uint32_t type
Operating system type.
Definition: ena.h:12
#define INTF_COL(intf)
Find debugging colourisation for an object interface.
Definition: interface.h:282
#define DBGC(...)
Definition: compiler.h:505
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
void * intf_object(struct interface *intf)
Get pointer to object containing object interface.
Definition: interface.c:160
struct interface * intf
Original interface.
Definition: interface.h:159
unsigned long tmp
Definition: linux_pci.h:65
An object interface.
Definition: interface.h:125
void intf_unplug(struct interface *intf)
Unplug an object interface.
Definition: interface.c:118
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:79
int xfer_vreopen(struct interface *intf, int type, va_list args)
Reopen location.
Definition: open.c:225
static uint16_t struct vmbus_xfer_pages_operations * op
Definition: netvsc.h:327
void intf_put(struct interface *intf)
Decrement reference count on an object interface.
Definition: interface.c:150
#define intf_get_dest_op_no_passthru(intf, type, dest)
Get object interface destination and operation method (without pass-through)
Definition: interface.h:258
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" return dest
Definition: string.h:151
static void intf_temp_init(struct interface *intf, struct interface *original)
Initialise a temporary outbound-only object interface.
Definition: interface.h:233
void intf_plug(struct interface *intf, struct interface *dest)
Plug an object interface into a new destination object interface.
Definition: interface.c:84

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)

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
size_t xfer_window(struct interface *intf)
Check flow control window.
Definition: xfer.c:117
void * intf_object(struct interface *intf)
Get pointer to object containing object interface.
Definition: interface.c:160
struct interface * intf
Original interface.
Definition: interface.h:159
An object interface.
Definition: interface.h:125
ring len
Length.
Definition: dwmac.h:231
#define xfer_window_TYPE(object_type)
Definition: xfer.h:74
static uint16_t struct vmbus_xfer_pages_operations * op
Definition: netvsc.h:327
void intf_put(struct interface *intf)
Decrement reference count on an object interface.
Definition: interface.c:150
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" return dest
Definition: string.h:151
#define intf_get_dest_op(intf, type, dest)
Get object interface destination and operation method.
Definition: interface.h:270

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)

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 xfer_window_changed(struct interface *intf)
Report change of flow control window.
Definition: xfer.c:147
struct interface * intf
Original interface.
Definition: interface.h:159
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 
)

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 }
#define INTF_INTF_FMT
printf() format string for INTF_INTF_DBG()
Definition: interface.h:298
#define INTF_INTF_DBG(intf, dest)
printf() arguments for representing an object interface pair
Definition: interface.h:307
#define INTF_COL(intf)
Find debugging colourisation for an object interface.
Definition: interface.h:282
#define DBGC(...)
Definition: compiler.h:505
struct io_buffer * xfer_alloc_iob(struct interface *intf, size_t len)
Allocate I/O buffer.
Definition: xfer.c:159
struct io_buffer * alloc_iob(size_t len)
Allocate I/O buffer.
Definition: iobuf.c:131
void * intf_object(struct interface *intf)
Get pointer to object containing object interface.
Definition: interface.c:160
struct interface * intf
Original interface.
Definition: interface.h:159
An object interface.
Definition: interface.h:125
ring len
Length.
Definition: dwmac.h:231
static uint16_t struct vmbus_xfer_pages_operations * op
Definition: netvsc.h:327
void intf_put(struct interface *intf)
Decrement reference count on an object interface.
Definition: interface.c:150
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" return dest
Definition: string.h:151
#define xfer_alloc_iob_TYPE(object_type)
Definition: xfer.h:83
#define intf_get_dest_op(intf, type, dest)
Get object interface destination and operation method.
Definition: interface.h:270
A persistent I/O buffer.
Definition: iobuf.h:38

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 
)

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 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define INTF_INTF_FMT
printf() format string for INTF_INTF_DBG()
Definition: interface.h:298
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
Definition: iobuf.c:153
#define INTF_INTF_DBG(intf, dest)
printf() arguments for representing an object interface pair
Definition: interface.h:307
#define EPIPE
Broken pipe.
Definition: errno.h:620
#define INTF_COL(intf)
Find debugging colourisation for an object interface.
Definition: interface.h:282
#define DBGC(...)
Definition: compiler.h:505
void * intf_object(struct interface *intf)
Get pointer to object containing object interface.
Definition: interface.c:160
#define xfer_deliver_TYPE(object_type)
Definition: xfer.h:89
struct interface * intf
Original interface.
Definition: interface.h:159
An object interface.
Definition: interface.h:125
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:79
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
static uint16_t struct vmbus_xfer_pages_operations * op
Definition: netvsc.h:327
void intf_put(struct interface *intf)
Decrement reference count on an object interface.
Definition: interface.c:150
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" return dest
Definition: string.h:151
uint8_t meta
Metadata flags.
Definition: ena.h:14
#define intf_get_dest_op(intf, type, dest)
Get object interface destination and operation method.
Definition: interface.h:270

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

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 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define va_end(ap)
Definition: stdarg.h:10
uint32_t type
Operating system type.
Definition: ena.h:12
int xfer_vredirect(struct interface *intf, int type, va_list args)
Send redirection event.
Definition: xfer.c:63
struct interface * intf
Original interface.
Definition: interface.h:159
__builtin_va_list va_list
Definition: stdarg.h:7
#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 
)

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 }
struct interface * intf
Original interface.
Definition: interface.h:159
int xfer_deliver(struct interface *intf, struct io_buffer *iobuf, struct xfer_metadata *meta)
Deliver datagram.
Definition: xfer.c:195
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 
)

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 }
#define iob_put(iobuf, len)
Definition: iobuf.h:125
struct io_buffer * xfer_alloc_iob(struct interface *intf, size_t len)
Allocate I/O buffer.
Definition: xfer.c:159
#define ENOMEM
Not enough space.
Definition: errno.h:535
void * memcpy(void *dest, const void *src, size_t len) __nonnull
ring len
Length.
Definition: dwmac.h:231
int xfer_deliver(struct interface *intf, struct io_buffer *iobuf, struct xfer_metadata *meta)
Deliver datagram.
Definition: xfer.c:195
uint8_t data[48]
Additional event data.
Definition: ena.h:22
uint8_t meta
Metadata flags.
Definition: ena.h:14
A persistent I/O buffer.
Definition: iobuf.h:38

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 
)

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
ring len
Length.
Definition: dwmac.h:231
uint8_t data[48]
Additional event data.
Definition: ena.h:22
static struct xfer_metadata dummy_metadata
Dummy transfer metadata.
Definition: xfer.c:47

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 
)

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 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define va_end(ap)
Definition: stdarg.h:10
#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
ring len
Length.
Definition: dwmac.h:231
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
__builtin_va_list va_list
Definition: stdarg.h:7
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().

◆ xfer_printf()

int xfer_printf ( struct interface intf,
const char *  format,
  ... 
)

Deliver formatted string.

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

Definition at line 335 of file xfer.c.

335  {
336  va_list args;
337  int rc;
338 
339  va_start ( args, format );
340  rc = xfer_vprintf ( intf, format, args );
341  va_end ( args );
342  return rc;
343 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define va_end(ap)
Definition: stdarg.h:10
int xfer_vprintf(struct interface *intf, const char *format, va_list args)
Deliver formatted string.
Definition: xfer.c:301
__builtin_va_list va_list
Definition: stdarg.h:7
#define va_start(ap, last)
Definition: stdarg.h:8
int const char * format
Definition: xfer.h:105

References format, rc, va_end, va_start, and xfer_vprintf().

Referenced by ftp_next_state(), and syslog_send().

◆ xfer_seek()

int xfer_seek ( struct interface intf,
off_t  offset 
)

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 }
Data transfer metadata.
Definition: xfer.h:23
#define INTF_DBG(intf)
printf() arguments for representing an object interface
Definition: interface.h:293
#define XFER_FL_ABS_OFFSET
Offset is absolute.
Definition: xfer.h:48
#define INTF_COL(intf)
Find debugging colourisation for an object interface.
Definition: interface.h:282
#define DBGC(...)
Definition: compiler.h:505
struct io_buffer * xfer_alloc_iob(struct interface *intf, size_t len)
Allocate I/O buffer.
Definition: xfer.c:159
#define ENOMEM
Not enough space.
Definition: errno.h:535
int xfer_deliver(struct interface *intf, struct io_buffer *iobuf, struct xfer_metadata *meta)
Deliver datagram.
Definition: xfer.c:195
uint16_t offset
Offset to command line.
Definition: bzimage.h:8
uint8_t meta
Metadata flags.
Definition: ena.h:14
#define INTF_FMT
printf() format string for INTF_DBG()
Definition: interface.h:285
A persistent I/O buffer.
Definition: iobuf.h:38

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 
)

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 XFER_FL_ABS_OFFSET
Offset is absolute.
Definition: xfer.h:48
ring len
Length.
Definition: dwmac.h:231
#define EPROTO
Protocol error.
Definition: errno.h:625
uint8_t meta
Metadata flags.
Definition: ena.h:14

References EPROTO, len, meta, and XFER_FL_ABS_OFFSET.

Referenced by peerblk_raw_rx().

Variable Documentation

◆ dummy_metadata

struct xfer_metadata dummy_metadata
static

Dummy transfer metadata.

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

Definition at line 47 of file xfer.c.

Referenced by xfer_deliver_iob(), and xfer_deliver_raw().