iPXE
Functions | Variables
xferbuf.c File Reference

Data transfer buffer. More...

#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <ipxe/xfer.h>
#include <ipxe/iobuf.h>
#include <ipxe/umalloc.h>
#include <ipxe/profile.h>
#include <ipxe/xferbuf.h>

Go to the source code of this file.

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
void xferbuf_detach (struct xfer_buffer *xferbuf)
 Detach data from data transfer buffer. More...
 
void xferbuf_free (struct xfer_buffer *xferbuf)
 Free data transfer buffer. More...
 
static int xferbuf_ensure_size (struct xfer_buffer *xferbuf, size_t len)
 Ensure that data transfer buffer is large enough for the specified size. More...
 
int xferbuf_write (struct xfer_buffer *xferbuf, size_t offset, const void *data, size_t len)
 Write to data transfer buffer. More...
 
int xferbuf_read (struct xfer_buffer *xferbuf, size_t offset, void *data, size_t len)
 Read from data transfer buffer. More...
 
int xferbuf_deliver (struct xfer_buffer *xferbuf, struct io_buffer *iobuf, struct xfer_metadata *meta)
 Add received data to data transfer buffer. More...
 
static int xferbuf_malloc_realloc (struct xfer_buffer *xferbuf, size_t len)
 Reallocate malloc()-based data transfer buffer. More...
 
static int xferbuf_umalloc_realloc (struct xfer_buffer *xferbuf, size_t len)
 Reallocate umalloc()-based data transfer buffer. More...
 
static int xferbuf_fixed_realloc (struct xfer_buffer *xferbuf, size_t len)
 Reallocate fixed-size data transfer buffer. More...
 
static int xferbuf_void_realloc (struct xfer_buffer *xferbuf, size_t len __unused)
 Reallocate void data transfer buffer. More...
 
struct xfer_bufferxfer_buffer (struct interface *intf)
 Get underlying data transfer buffer. More...
 

Variables

static struct profiler xferbuf_deliver_profiler __profiler
 Data delivery profiler. More...
 
struct xfer_buffer_operations xferbuf_malloc_operations
 malloc()-based data buffer operations More...
 
struct xfer_buffer_operations xferbuf_umalloc_operations
 umalloc()-based data buffer operations More...
 
struct xfer_buffer_operations xferbuf_fixed_operations
 Fixed-size data buffer operations. More...
 
struct xfer_buffer_operations xferbuf_void_operations
 Void data buffer operations. More...
 

Detailed Description

Data transfer buffer.

Definition in file xferbuf.c.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ xferbuf_detach()

void xferbuf_detach ( struct xfer_buffer xferbuf)

Detach data from data transfer buffer.

Parameters
xferbufData transfer buffer

The caller assumes responsibility for eventually freeing the data previously owned by the data transfer buffer.

Definition at line 61 of file xferbuf.c.

61  {
62 
63  xferbuf->data = NULL;
64  xferbuf->len = 0;
65  xferbuf->pos = 0;
66 }
void * data
Data.
Definition: xferbuf.h:20
size_t pos
Current offset within data.
Definition: xferbuf.h:24
size_t len
Size of data.
Definition: xferbuf.h:22
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

References xfer_buffer::data, xfer_buffer::len, NULL, and xfer_buffer::pos.

Referenced by downloader_finished(), and xferbuf_free().

◆ xferbuf_free()

void xferbuf_free ( struct xfer_buffer xferbuf)

Free data transfer buffer.

Parameters
xferbufData transfer buffer

Definition at line 73 of file xferbuf.c.

73  {
74 
75  xferbuf->op->realloc ( xferbuf, 0 );
76  xferbuf_detach ( xferbuf );
77 }
struct xfer_buffer_operations * op
Data transfer buffer operations.
Definition: xferbuf.h:26
void xferbuf_detach(struct xfer_buffer *xferbuf)
Detach data from data transfer buffer.
Definition: xferbuf.c:61
int(* realloc)(struct xfer_buffer *xferbuf, size_t len)
Reallocate data buffer.
Definition: xferbuf.h:37

References xfer_buffer::op, xfer_buffer_operations::realloc, and xferbuf_detach().

Referenced by downloader_free(), peerblk_reset(), peermux_free(), validator_free(), and validator_xfer_close().

◆ xferbuf_ensure_size()

static int xferbuf_ensure_size ( struct xfer_buffer xferbuf,
size_t  len 
)
static

Ensure that data transfer buffer is large enough for the specified size.

Parameters
xferbufData transfer buffer
lenRequired minimum size
Return values
rcReturn status code

Definition at line 86 of file xferbuf.c.

86  {
87  int rc;
88 
89  /* If buffer is already large enough, do nothing */
90  if ( len <= xferbuf->len )
91  return 0;
92 
93  /* Extend buffer */
94  if ( ( rc = xferbuf->op->realloc ( xferbuf, len ) ) != 0 ) {
95  DBGC ( xferbuf, "XFERBUF %p could not extend buffer to "
96  "%zd bytes: %s\n", xferbuf, len, strerror ( rc ) );
97  return rc;
98  }
99  xferbuf->len = len;
100 
101  return 0;
102 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define DBGC(...)
Definition: compiler.h:505
size_t len
Size of data.
Definition: xferbuf.h:22
ring len
Length.
Definition: dwmac.h:231
struct xfer_buffer_operations * op
Data transfer buffer operations.
Definition: xferbuf.h:26
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
int(* realloc)(struct xfer_buffer *xferbuf, size_t len)
Reallocate data buffer.
Definition: xferbuf.h:37

References DBGC, xfer_buffer::len, len, xfer_buffer::op, rc, xfer_buffer_operations::realloc, and strerror().

Referenced by xferbuf_write().

◆ xferbuf_write()

int xferbuf_write ( struct xfer_buffer xferbuf,
size_t  offset,
const void *  data,
size_t  len 
)

Write to data transfer buffer.

Parameters
xferbufData transfer buffer
offsetStarting offset
dataData to write
lenLength of data

Definition at line 112 of file xferbuf.c.

113  {
114  size_t max_len;
115  int rc;
116 
117  /* Check for overflow */
118  max_len = ( offset + len );
119  if ( max_len < offset )
120  return -EOVERFLOW;
121 
122  /* Ensure buffer is large enough to contain this write */
123  if ( ( rc = xferbuf_ensure_size ( xferbuf, max_len ) ) != 0 )
124  return rc;
125 
126  /* Check that buffer is non-void */
127  if ( len && ( ! xferbuf->data ) )
128  return -ENOTTY;
129 
130  /* Copy data to buffer */
131  profile_start ( &xferbuf_write_profiler );
132  memcpy ( ( xferbuf->data + offset ), data, len );
133  profile_stop ( &xferbuf_write_profiler );
134 
135  return 0;
136 }
void * data
Data.
Definition: xferbuf.h:20
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
static void profile_stop(struct profiler *profiler)
Stop profiling.
Definition: profile.h:173
void * memcpy(void *dest, const void *src, size_t len) __nonnull
ring len
Length.
Definition: dwmac.h:231
static void profile_start(struct profiler *profiler)
Start profiling.
Definition: profile.h:160
#define EOVERFLOW
Value too large to be stored in data type.
Definition: errno.h:609
#define ENOTTY
Inappropriate I/O control operation.
Definition: errno.h:594
static int xferbuf_ensure_size(struct xfer_buffer *xferbuf, size_t len)
Ensure that data transfer buffer is large enough for the specified size.
Definition: xferbuf.c:86
uint8_t data[48]
Additional event data.
Definition: ena.h:22
uint16_t offset
Offset to command line.
Definition: bzimage.h:8

References xfer_buffer::data, data, ENOTTY, EOVERFLOW, len, memcpy(), offset, profile_start(), profile_stop(), rc, and xferbuf_ensure_size().

Referenced by peerblk_decrypt_write(), peerblk_retrieval_rx(), and xferbuf_deliver().

◆ xferbuf_read()

int xferbuf_read ( struct xfer_buffer xferbuf,
size_t  offset,
void *  data,
size_t  len 
)

Read from data transfer buffer.

Parameters
xferbufData transfer buffer
offsetStarting offset
dataData to write
lenLength of data

Definition at line 146 of file xferbuf.c.

147  {
148 
149  /* Check that read is within buffer range */
150  if ( ( offset > xferbuf->len ) ||
151  ( len > ( xferbuf->len - offset ) ) )
152  return -ENOENT;
153 
154  /* Check that buffer is non-void */
155  if ( len && ( ! xferbuf->data ) )
156  return -ENOTTY;
157 
158  /* Copy data from buffer */
159  profile_start ( &xferbuf_read_profiler );
160  memcpy ( data, ( xferbuf->data + offset ), len );
161  profile_stop ( &xferbuf_read_profiler );
162 
163  return 0;
164 }
void * data
Data.
Definition: xferbuf.h:20
#define ENOENT
No such file or directory.
Definition: errno.h:514
static void profile_stop(struct profiler *profiler)
Stop profiling.
Definition: profile.h:173
size_t len
Size of data.
Definition: xferbuf.h:22
void * memcpy(void *dest, const void *src, size_t len) __nonnull
ring len
Length.
Definition: dwmac.h:231
static void profile_start(struct profiler *profiler)
Start profiling.
Definition: profile.h:160
#define ENOTTY
Inappropriate I/O control operation.
Definition: errno.h:594
uint8_t data[48]
Additional event data.
Definition: ena.h:22
uint16_t offset
Offset to command line.
Definition: bzimage.h:8

References xfer_buffer::data, data, ENOENT, ENOTTY, xfer_buffer::len, len, memcpy(), offset, profile_start(), and profile_stop().

Referenced by peerblk_decrypt_read().

◆ xferbuf_deliver()

int xferbuf_deliver ( struct xfer_buffer xferbuf,
struct io_buffer iobuf,
struct xfer_metadata meta 
)

Add received data to data transfer buffer.

Parameters
xferbufData transfer buffer
iobufI/O buffer
metaData transfer metadata
Return values
rcReturn status code

Definition at line 174 of file xferbuf.c.

175  {
176  size_t len = iob_len ( iobuf );
177  size_t pos;
178  int rc;
179 
180  /* Start profiling */
181  profile_start ( &xferbuf_deliver_profiler );
182 
183  /* Calculate new buffer position */
184  pos = xferbuf->pos;
185  if ( meta->flags & XFER_FL_ABS_OFFSET )
186  pos = 0;
187  pos += meta->offset;
188 
189  /* Write data to buffer */
190  if ( ( rc = xferbuf_write ( xferbuf, pos, iobuf->data, len ) ) != 0 )
191  goto done;
192 
193  /* Update current buffer position */
194  xferbuf->pos = ( pos + len );
195 
196  done:
197  free_iob ( iobuf );
198  profile_stop ( &xferbuf_deliver_profiler );
199  return rc;
200 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define XFER_FL_ABS_OFFSET
Offset is absolute.
Definition: xfer.h:47
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
Definition: iobuf.c:152
size_t pos
Current offset within data.
Definition: xferbuf.h:24
static void profile_stop(struct profiler *profiler)
Stop profiling.
Definition: profile.h:173
int xferbuf_write(struct xfer_buffer *xferbuf, size_t offset, const void *data, size_t len)
Write to data transfer buffer.
Definition: xferbuf.c:112
ring len
Length.
Definition: dwmac.h:231
static void profile_start(struct profiler *profiler)
Start profiling.
Definition: profile.h:160
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition: iobuf.h:159
void * data
Start of data.
Definition: iobuf.h:52
uint8_t meta
Metadata flags.
Definition: ena.h:14
struct bofm_section_header done
Definition: bofm_test.c:46

References io_buffer::data, done, free_iob(), iob_len(), len, meta, xfer_buffer::pos, profile_start(), profile_stop(), rc, XFER_FL_ABS_OFFSET, and xferbuf_write().

Referenced by blktrans_deliver(), downloader_deliver(), efi_pxe_tftp_deliver(), peermux_info_deliver(), and validator_xfer_deliver().

◆ xferbuf_malloc_realloc()

static int xferbuf_malloc_realloc ( struct xfer_buffer xferbuf,
size_t  len 
)
static

Reallocate malloc()-based data transfer buffer.

Parameters
xferbufData transfer buffer
lenNew length (or zero to free buffer)
Return values
rcReturn status code

Definition at line 209 of file xferbuf.c.

209  {
210  void *new_data;
211 
212  new_data = realloc ( xferbuf->data, len );
213  if ( ! new_data )
214  return -ENOSPC;
215  xferbuf->data = new_data;
216  return 0;
217 }
void * data
Data.
Definition: xferbuf.h:20
ring len
Length.
Definition: dwmac.h:231
#define ENOSPC
No space left on device.
Definition: errno.h:549
void * realloc(void *old_ptr, size_t new_size)
Reallocate memory.
Definition: malloc.c:606

References xfer_buffer::data, ENOSPC, len, and realloc().

◆ xferbuf_umalloc_realloc()

static int xferbuf_umalloc_realloc ( struct xfer_buffer xferbuf,
size_t  len 
)
static

Reallocate umalloc()-based data transfer buffer.

Parameters
xferbufData transfer buffer
lenNew length (or zero to free buffer)
Return values
rcReturn status code

Definition at line 231 of file xferbuf.c.

231  {
232  void *new_udata;
233 
234  new_udata = urealloc ( xferbuf->data, len );
235  if ( ! new_udata )
236  return -ENOSPC;
237  xferbuf->data = new_udata;
238  return 0;
239 }
void * data
Data.
Definition: xferbuf.h:20
ring len
Length.
Definition: dwmac.h:231
#define ENOSPC
No space left on device.
Definition: errno.h:549
void * urealloc(void *ptr, size_t new_size)
Reallocate external memory.

References xfer_buffer::data, ENOSPC, len, and urealloc().

◆ xferbuf_fixed_realloc()

static int xferbuf_fixed_realloc ( struct xfer_buffer xferbuf,
size_t  len 
)
static

Reallocate fixed-size data transfer buffer.

Parameters
xferbufData transfer buffer
lenNew length (or zero to free buffer)
Return values
rcReturn status code

Definition at line 253 of file xferbuf.c.

253  {
254 
255  /* Refuse to allocate extra space */
256  if ( len > xferbuf->len ) {
257  /* Note that EFI relies upon this error mapping to
258  * EFI_BUFFER_TOO_SMALL.
259  */
260  return -ERANGE;
261  }
262 
263  return 0;
264 }
size_t len
Size of data.
Definition: xferbuf.h:22
ring len
Length.
Definition: dwmac.h:231
#define ERANGE
Result too large.
Definition: errno.h:639

References ERANGE, xfer_buffer::len, and len.

◆ xferbuf_void_realloc()

static int xferbuf_void_realloc ( struct xfer_buffer xferbuf,
size_t len  __unused 
)
static

Reallocate void data transfer buffer.

Parameters
xferbufData transfer buffer
lenNew length (or zero to free buffer)
Return values
rcReturn status code

Definition at line 278 of file xferbuf.c.

279  {
280 
281  /* Succeed without ever allocating data */
282  assert ( xferbuf->data == NULL );
283  return 0;
284 }
void * data
Data.
Definition: xferbuf.h:20
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

References assert(), xfer_buffer::data, and NULL.

◆ xfer_buffer()

struct xfer_buffer* xfer_buffer ( struct interface intf)

Get underlying data transfer buffer.

Parameters
interfaceData transfer interface
Return values
xferbufData transfer buffer, or NULL on error

This call will check that the xfer_buffer() handler belongs to the destination interface which also provides xfer_deliver() for this interface.

This is done to prevent accidental accesses to a data transfer buffer which may be located behind a non-transparent datapath via a series of pass-through interfaces.

Definition at line 305 of file xferbuf.c.

305  {
306  struct interface *dest;
307  xfer_buffer_TYPE ( void * ) *op =
309  void *object = intf_object ( dest );
310  struct interface *xfer_deliver_dest;
311  struct xfer_buffer *xferbuf;
312 
313  /* Check that this operation is provided by the same interface
314  * which handles xfer_deliver().
315  */
316  ( void ) intf_get_dest_op ( intf, xfer_deliver, &xfer_deliver_dest );
317 
318  if ( op && ( dest == xfer_deliver_dest ) ) {
319  xferbuf = op ( object );
320  } else {
321  /* Default is to not have a data transfer buffer */
322  xferbuf = NULL;
323  }
324 
325  intf_put ( xfer_deliver_dest );
326  intf_put ( dest );
327  return xferbuf;
328 }
A data transfer buffer.
Definition: xferbuf.h:18
void * intf_object(struct interface *intf)
Get pointer to object containing object interface.
Definition: interface.c:159
struct interface * intf
Original interface.
Definition: interface.h:158
An object interface.
Definition: interface.h:124
#define xfer_buffer_TYPE(object_type)
Definition: xferbuf.h:110
int xfer_deliver(struct interface *intf, struct io_buffer *iobuf, struct xfer_metadata *meta)
Deliver datagram.
Definition: xfer.c:194
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:149
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:150
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
#define intf_get_dest_op(intf, type, dest)
Get object interface destination and operation method.
Definition: interface.h:269

References dest, interface::intf, intf_get_dest_op, intf_object(), intf_put(), NULL, op, xfer_buffer_TYPE, and xfer_deliver().

Referenced by http_content_buffer(), peerblk_decrypt(), and peermux_block_buffer().

Variable Documentation

◆ __profiler

struct profiler xferbuf_read_profiler __profiler
static
Initial value:
=
{ .name = "xferbuf.deliver" }

Data delivery profiler.

Data read profiler.

Data write profiler.

Definition at line 42 of file xferbuf.c.

◆ xferbuf_malloc_operations

struct xfer_buffer_operations xferbuf_malloc_operations
Initial value:
= {
}
static int xferbuf_malloc_realloc(struct xfer_buffer *xferbuf, size_t len)
Reallocate malloc()-based data transfer buffer.
Definition: xferbuf.c:209

malloc()-based data buffer operations

Definition at line 220 of file xferbuf.c.

Referenced by xferbuf_malloc_init().

◆ xferbuf_umalloc_operations

struct xfer_buffer_operations xferbuf_umalloc_operations
Initial value:
= {
}
static int xferbuf_umalloc_realloc(struct xfer_buffer *xferbuf, size_t len)
Reallocate umalloc()-based data transfer buffer.
Definition: xferbuf.c:231

umalloc()-based data buffer operations

Definition at line 242 of file xferbuf.c.

Referenced by xferbuf_umalloc_init().

◆ xferbuf_fixed_operations

struct xfer_buffer_operations xferbuf_fixed_operations
Initial value:
= {
}
static int xferbuf_fixed_realloc(struct xfer_buffer *xferbuf, size_t len)
Reallocate fixed-size data transfer buffer.
Definition: xferbuf.c:253

Fixed-size data buffer operations.

Definition at line 267 of file xferbuf.c.

Referenced by xferbuf_fixed_init().

◆ xferbuf_void_operations

struct xfer_buffer_operations xferbuf_void_operations
Initial value:
= {
}
static int xferbuf_void_realloc(struct xfer_buffer *xferbuf, size_t len __unused)
Reallocate void data transfer buffer.
Definition: xferbuf.c:278

Void data buffer operations.

Definition at line 287 of file xferbuf.c.

Referenced by xferbuf_void_init().