iPXE
Data Structures | Macros | Functions | Variables
xferbuf.h File Reference

Data transfer buffer. More...

#include <stdint.h>
#include <ipxe/iobuf.h>
#include <ipxe/interface.h>
#include <ipxe/xfer.h>

Go to the source code of this file.

Data Structures

struct  xfer_buffer
 A data transfer buffer. More...
 
struct  xfer_buffer_operations
 Data transfer buffer operations. More...
 

Macros

#define xfer_buffer_TYPE(object_type)   typeof ( struct xfer_buffer * ( object_type ) )
 

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
 FILE_SECBOOT (PERMITTED)
 
static void xferbuf_malloc_init (struct xfer_buffer *xferbuf)
 Initialise malloc()-based data transfer buffer. More...
 
static void xferbuf_umalloc_init (struct xfer_buffer *xferbuf)
 Initialise umalloc()-based data transfer buffer. More...
 
static void xferbuf_fixed_init (struct xfer_buffer *xferbuf, void *data, size_t len)
 Initialise fixed-size data transfer buffer. More...
 
static void xferbuf_void_init (struct xfer_buffer *xferbuf)
 Initialise void data transfer buffer. More...
 
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...
 
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...
 
struct xfer_bufferxfer_buffer (struct interface *intf)
 Get underlying data transfer buffer. More...
 

Variables

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.h.

Macro Definition Documentation

◆ xfer_buffer_TYPE

#define xfer_buffer_TYPE (   object_type)    typeof ( struct xfer_buffer * ( object_type ) )

Definition at line 111 of file xferbuf.h.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ FILE_SECBOOT()

FILE_SECBOOT ( PERMITTED  )

◆ xferbuf_malloc_init()

static void xferbuf_malloc_init ( struct xfer_buffer xferbuf)
inlinestatic

Initialise malloc()-based data transfer buffer.

Parameters
xferbufData transfer buffer

Data will be automatically allocated using malloc().

Definition at line 54 of file xferbuf.h.

54  {
55  xferbuf->op = &xferbuf_malloc_operations;
56 }
struct xfer_buffer_operations * op
Data transfer buffer operations.
Definition: xferbuf.h:27
struct xfer_buffer_operations xferbuf_malloc_operations
malloc()-based data buffer operations
Definition: xferbuf.c:221

References xfer_buffer::op, and xferbuf_malloc_operations.

Referenced by create_validator(), and peerblk_open().

◆ xferbuf_umalloc_init()

static void xferbuf_umalloc_init ( struct xfer_buffer xferbuf)
inlinestatic

Initialise umalloc()-based data transfer buffer.

Parameters
xferbufData transfer buffer

Data will be automatically allocated using umalloc() (and may therefore alter the system memory map).

Definition at line 67 of file xferbuf.h.

67  {
68  xferbuf->op = &xferbuf_umalloc_operations;
69 }
struct xfer_buffer_operations xferbuf_umalloc_operations
umalloc()-based data buffer operations
Definition: xferbuf.c:243
struct xfer_buffer_operations * op
Data transfer buffer operations.
Definition: xferbuf.h:27

References xfer_buffer::op, and xferbuf_umalloc_operations.

Referenced by create_downloader(), and peermux_filter().

◆ xferbuf_fixed_init()

static void xferbuf_fixed_init ( struct xfer_buffer xferbuf,
void *  data,
size_t  len 
)
inlinestatic

Initialise fixed-size data transfer buffer.

Parameters
xferbufData transfer buffer
dataData buffer
lenLength of data buffer

Data will be never be automatically allocated.

Definition at line 81 of file xferbuf.h.

81  {
82  xferbuf->data = data;
83  xferbuf->len = len;
84  xferbuf->op = &xferbuf_fixed_operations;
85 }
void * data
Data.
Definition: xferbuf.h:21
size_t len
Size of data.
Definition: xferbuf.h:23
ring len
Length.
Definition: dwmac.h:231
struct xfer_buffer_operations * op
Data transfer buffer operations.
Definition: xferbuf.h:27
struct xfer_buffer_operations xferbuf_fixed_operations
Fixed-size data buffer operations.
Definition: xferbuf.c:268
uint8_t data[48]
Additional event data.
Definition: ena.h:22

References xfer_buffer::data, data, xfer_buffer::len, len, xfer_buffer::op, and xferbuf_fixed_operations.

Referenced by block_translate(), and efi_pxe_mtftp().

◆ xferbuf_void_init()

static void xferbuf_void_init ( struct xfer_buffer xferbuf)
inlinestatic

Initialise void data transfer buffer.

Parameters
xferbufData transfer buffer

No data will be allocated, but the length will be recorded. This can be used to capture xfer_seek() results.

Definition at line 96 of file xferbuf.h.

96  {
97  xferbuf->op = &xferbuf_void_operations;
98 }
struct xfer_buffer_operations xferbuf_void_operations
Void data buffer operations.
Definition: xferbuf.c:288
struct xfer_buffer_operations * op
Data transfer buffer operations.
Definition: xferbuf.h:27

References xfer_buffer::op, and xferbuf_void_operations.

Referenced by block_translate().

◆ 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 62 of file xferbuf.c.

62  {
63 
64  xferbuf->data = NULL;
65  xferbuf->len = 0;
66  xferbuf->pos = 0;
67 }
void * data
Data.
Definition: xferbuf.h:21
size_t pos
Current offset within data.
Definition: xferbuf.h:25
size_t len
Size of data.
Definition: xferbuf.h:23
#define NULL
NULL pointer (VOID *)
Definition: Base.h:322

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 74 of file xferbuf.c.

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

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_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 113 of file xferbuf.c.

114  {
115  size_t max_len;
116  int rc;
117 
118  /* Check for overflow */
119  max_len = ( offset + len );
120  if ( max_len < offset )
121  return -EOVERFLOW;
122 
123  /* Ensure buffer is large enough to contain this write */
124  if ( ( rc = xferbuf_ensure_size ( xferbuf, max_len ) ) != 0 )
125  return rc;
126 
127  /* Check that buffer is non-void */
128  if ( len && ( ! xferbuf->data ) )
129  return -ENOTTY;
130 
131  /* Copy data to buffer */
132  profile_start ( &xferbuf_write_profiler );
133  memcpy ( ( xferbuf->data + offset ), data, len );
134  profile_stop ( &xferbuf_write_profiler );
135 
136  return 0;
137 }
void * data
Data.
Definition: xferbuf.h:21
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
static void profile_stop(struct profiler *profiler)
Stop profiling.
Definition: profile.h:174
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:161
#define EOVERFLOW
Value too large to be stored in data type.
Definition: errno.h:610
#define ENOTTY
Inappropriate I/O control operation.
Definition: errno.h:595
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:87
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 147 of file xferbuf.c.

148  {
149 
150  /* Check that read is within buffer range */
151  if ( ( offset > xferbuf->len ) ||
152  ( len > ( xferbuf->len - offset ) ) )
153  return -ENOENT;
154 
155  /* Check that buffer is non-void */
156  if ( len && ( ! xferbuf->data ) )
157  return -ENOTTY;
158 
159  /* Copy data from buffer */
160  profile_start ( &xferbuf_read_profiler );
161  memcpy ( data, ( xferbuf->data + offset ), len );
162  profile_stop ( &xferbuf_read_profiler );
163 
164  return 0;
165 }
void * data
Data.
Definition: xferbuf.h:21
#define ENOENT
No such file or directory.
Definition: errno.h:515
static void profile_stop(struct profiler *profiler)
Stop profiling.
Definition: profile.h:174
size_t len
Size of data.
Definition: xferbuf.h:23
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:161
#define ENOTTY
Inappropriate I/O control operation.
Definition: errno.h:595
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 175 of file xferbuf.c.

176  {
177  size_t len = iob_len ( iobuf );
178  size_t pos;
179  int rc;
180 
181  /* Start profiling */
182  profile_start ( &xferbuf_deliver_profiler );
183 
184  /* Calculate new buffer position */
185  pos = xferbuf->pos;
186  if ( meta->flags & XFER_FL_ABS_OFFSET )
187  pos = 0;
188  pos += meta->offset;
189 
190  /* Write data to buffer */
191  if ( ( rc = xferbuf_write ( xferbuf, pos, iobuf->data, len ) ) != 0 )
192  goto done;
193 
194  /* Update current buffer position */
195  xferbuf->pos = ( pos + len );
196 
197  done:
198  free_iob ( iobuf );
199  profile_stop ( &xferbuf_deliver_profiler );
200  return rc;
201 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define XFER_FL_ABS_OFFSET
Offset is absolute.
Definition: xfer.h:48
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
Definition: iobuf.c:153
size_t pos
Current offset within data.
Definition: xferbuf.h:25
static void profile_stop(struct profiler *profiler)
Stop profiling.
Definition: profile.h:174
int xferbuf_write(struct xfer_buffer *xferbuf, size_t offset, const void *data, size_t len)
Write to data transfer buffer.
Definition: xferbuf.c:113
ring len
Length.
Definition: dwmac.h:231
static void profile_start(struct profiler *profiler)
Start profiling.
Definition: profile.h:161
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition: iobuf.h:160
void * data
Start of data.
Definition: iobuf.h:53
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().

◆ 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 306 of file xferbuf.c.

306  {
307  struct interface *dest;
308  xfer_buffer_TYPE ( void * ) *op =
310  void *object = intf_object ( dest );
311  struct interface *xfer_deliver_dest;
312  struct xfer_buffer *xferbuf;
313 
314  /* Check that this operation is provided by the same interface
315  * which handles xfer_deliver().
316  */
317  ( void ) intf_get_dest_op ( intf, xfer_deliver, &xfer_deliver_dest );
318 
319  if ( op && ( dest == xfer_deliver_dest ) ) {
320  xferbuf = op ( object );
321  } else {
322  /* Default is to not have a data transfer buffer */
323  xferbuf = NULL;
324  }
325 
326  intf_put ( xfer_deliver_dest );
327  intf_put ( dest );
328  return xferbuf;
329 }
A data transfer buffer.
Definition: xferbuf.h:19
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
#define xfer_buffer_TYPE(object_type)
Definition: xferbuf.h:111
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
#define NULL
NULL pointer (VOID *)
Definition: Base.h:322
#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(), NULL, op, xfer_buffer_TYPE, and xfer_deliver().

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

Variable Documentation

◆ xferbuf_malloc_operations

struct xfer_buffer_operations xferbuf_malloc_operations

malloc()-based data buffer operations

Definition at line 221 of file xferbuf.c.

Referenced by xferbuf_malloc_init().

◆ xferbuf_umalloc_operations

struct xfer_buffer_operations xferbuf_umalloc_operations

umalloc()-based data buffer operations

Definition at line 243 of file xferbuf.c.

Referenced by xferbuf_umalloc_init().

◆ xferbuf_fixed_operations

struct xfer_buffer_operations xferbuf_fixed_operations

Fixed-size data buffer operations.

Definition at line 268 of file xferbuf.c.

Referenced by xferbuf_fixed_init().

◆ xferbuf_void_operations

struct xfer_buffer_operations xferbuf_void_operations

Void data buffer operations.

Definition at line 288 of file xferbuf.c.

Referenced by xferbuf_void_init().