iPXE
Functions | Variables
blocktrans.c File Reference

Block device translator. More...

#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <assert.h>
#include <ipxe/iobuf.h>
#include <ipxe/xfer.h>
#include <ipxe/blockdev.h>
#include <ipxe/blocktrans.h>

Go to the source code of this file.

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
 FILE_SECBOOT (PERMITTED)
 
static void blktrans_close (struct block_translator *blktrans, int rc)
 Close block device translator. More...
 
static int blktrans_deliver (struct block_translator *blktrans, struct io_buffer *iobuf, struct xfer_metadata *meta)
 Deliver data. More...
 
static struct xfer_bufferblktrans_buffer (struct block_translator *blktrans)
 Get underlying data transfer buffer. More...
 
int block_translate (struct interface *block, void *buffer, size_t size)
 Insert block device translator. More...
 

Variables

static struct interface_operation blktrans_block_operations []
 Block device translator block device interface operations. More...
 
static struct interface_descriptor blktrans_block_desc
 Block device translator block device interface descriptor. More...
 
static struct interface_operation blktrans_xfer_operations []
 Block device translator data transfer interface operations. More...
 
static struct interface_descriptor blktrans_xfer_desc
 Block device translator data transfer interface descriptor. More...
 

Detailed Description

Block device translator.

Definition in file blocktrans.c.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ FILE_SECBOOT()

FILE_SECBOOT ( PERMITTED  )

◆ blktrans_close()

static void blktrans_close ( struct block_translator blktrans,
int  rc 
)
static

Close block device translator.

Parameters
blktransBlock device translator
rcReason for close

Definition at line 49 of file blocktrans.c.

49  {
50  struct block_device_capacity capacity;
51 
52  /* Report block device capacity, if applicable */
53  if ( ( rc == 0 ) && ( blktrans->blksize ) ) {
54 
55  /* Construct block device capacity */
56  capacity.blocks =
57  ( blktrans->xferbuf.len / blktrans->blksize );
58  capacity.blksize = blktrans->blksize;
59  capacity.max_count = -1U;
60 
61  /* Report block device capacity */
62  block_capacity ( &blktrans->block, &capacity );
63  }
64 
65  /* Shut down interfaces */
66  intf_shutdown ( &blktrans->xfer, rc );
67  intf_shutdown ( &blktrans->block, rc );
68 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
void intf_shutdown(struct interface *intf, int rc)
Shut down an object interface.
Definition: interface.c:279
void block_capacity(struct interface *intf, struct block_device_capacity *capacity)
Report block device capacity.
Definition: blockdev.c:130
size_t len
Size of data.
Definition: xferbuf.h:23
uint64_t blocks
Total number of blocks.
Definition: blockdev.h:20
struct interface xfer
Data transfer interface.
Definition: blocktrans.h:25
Block device capacity.
Definition: blockdev.h:18
struct xfer_buffer xferbuf
Data transfer buffer.
Definition: blocktrans.h:28
size_t blksize
Block size.
Definition: blocktrans.h:30
struct interface block
Block device interface.
Definition: blocktrans.h:23

References block_device_capacity::blksize, block_translator::blksize, block_translator::block, block_capacity(), block_device_capacity::blocks, intf_shutdown(), xfer_buffer::len, block_device_capacity::max_count, rc, block_translator::xfer, and block_translator::xferbuf.

Referenced by blktrans_deliver().

◆ blktrans_deliver()

static int blktrans_deliver ( struct block_translator blktrans,
struct io_buffer iobuf,
struct xfer_metadata meta 
)
static

Deliver data.

Parameters
blktransBlock device translator
iobufI/O buffer
metaData transfer metadata
Return values
rcReturn status code

Definition at line 78 of file blocktrans.c.

80  {
81  int rc;
82 
83  /* Deliver to buffer */
84  if ( ( rc = xferbuf_deliver ( &blktrans->xferbuf, iob_disown ( iobuf ),
85  meta ) ) != 0 ) {
86  DBGC ( blktrans, "BLKTRANS %p could not deliver: %s\n",
87  blktrans, strerror ( rc ) );
88  goto err;
89  }
90 
91  return 0;
92 
93  err:
94  blktrans_close ( blktrans, rc );
95  return rc;
96 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
int xferbuf_deliver(struct xfer_buffer *xferbuf, struct io_buffer *iobuf, struct xfer_metadata *meta)
Add received data to data transfer buffer.
Definition: xferbuf.c:175
static void blktrans_close(struct block_translator *blktrans, int rc)
Close block device translator.
Definition: blocktrans.c:49
#define DBGC(...)
Definition: compiler.h:505
#define iob_disown(iobuf)
Disown an I/O buffer.
Definition: iobuf.h:217
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:79
struct xfer_buffer xferbuf
Data transfer buffer.
Definition: blocktrans.h:28
uint8_t meta
Metadata flags.
Definition: ena.h:14

References blktrans_close(), DBGC, iob_disown, meta, rc, strerror(), block_translator::xferbuf, and xferbuf_deliver().

◆ blktrans_buffer()

static struct xfer_buffer* blktrans_buffer ( struct block_translator blktrans)
static

Get underlying data transfer buffer.

Parameters
blktransBlock device translator
Return values
xferbufData transfer buffer

Definition at line 105 of file blocktrans.c.

105  {
106 
107  return &blktrans->xferbuf;
108 }
struct xfer_buffer xferbuf
Data transfer buffer.
Definition: blocktrans.h:28

References block_translator::xferbuf.

◆ block_translate()

int block_translate ( struct interface block,
void *  buffer,
size_t  size 
)

Insert block device translator.

Parameters
blockBlock device interface
bufferData buffer (or NULL)
sizeLength of data buffer, or block size
Return values
rcReturn status code

Definition at line 140 of file blocktrans.c.

140  {
141  struct block_translator *blktrans;
142  int rc;
143 
144  /* Allocate and initialise structure */
145  blktrans = zalloc ( sizeof ( *blktrans ) );
146  if ( ! blktrans ) {
147  rc = -ENOMEM;
148  goto err_alloc;
149  }
150  ref_init ( &blktrans->refcnt, NULL );
151  intf_init ( &blktrans->block, &blktrans_block_desc, &blktrans->refcnt );
152  intf_init ( &blktrans->xfer, &blktrans_xfer_desc, &blktrans->refcnt );
153  if ( buffer ) {
154  xferbuf_fixed_init ( &blktrans->xferbuf, buffer, size );
155  } else {
156  xferbuf_void_init ( &blktrans->xferbuf );
157  blktrans->blksize = size;
158  }
159 
160  /* Attach to interfaces, mortalise self, and return */
161  intf_insert ( block, &blktrans->block, &blktrans->xfer );
162  ref_put ( &blktrans->refcnt );
163 
164  DBGC2 ( blktrans, "BLKTRANS %p created", blktrans );
165  if ( buffer ) {
166  DBGC2 ( blktrans, " for %#lx+%#zx",
167  virt_to_phys ( buffer ), size );
168  }
169  DBGC2 ( blktrans, "\n" );
170  return 0;
171 
172  ref_put ( &blktrans->refcnt );
173  err_alloc:
174  return rc;
175 }
struct refcnt refcnt
Reference count.
Definition: blocktrans.h:21
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
static struct interface_descriptor blktrans_block_desc
Block device translator block device interface descriptor.
Definition: blocktrans.c:116
#define ref_init(refcnt, free)
Initialise a reference counter.
Definition: refcnt.h:65
uint16_t size
Buffer size.
Definition: dwmac.h:14
uint32_t buffer
Buffer index (or NETVSC_RNDIS_NO_BUFFER)
Definition: netvsc.h:16
static void xferbuf_void_init(struct xfer_buffer *xferbuf)
Initialise void data transfer buffer.
Definition: xferbuf.h:96
#define ENOMEM
Not enough space.
Definition: errno.h:535
A block device translator.
Definition: blocktrans.h:19
struct interface xfer
Data transfer interface.
Definition: blocktrans.h:25
void * zalloc(size_t size)
Allocate cleared memory.
Definition: malloc.c:662
static struct interface_descriptor blktrans_xfer_desc
Block device translator data transfer interface descriptor.
Definition: blocktrans.c:128
void intf_insert(struct interface *intf, struct interface *upper, struct interface *lower)
Insert a filter interface.
Definition: interface.c:402
#define DBGC2(...)
Definition: compiler.h:522
uint8_t block[3][8]
DES-encrypted blocks.
Definition: mschapv2.h:12
struct xfer_buffer xferbuf
Data transfer buffer.
Definition: blocktrans.h:28
size_t blksize
Block size.
Definition: blocktrans.h:30
static void intf_init(struct interface *intf, struct interface_descriptor *desc, struct refcnt *refcnt)
Initialise an object interface.
Definition: interface.h:204
static void xferbuf_fixed_init(struct xfer_buffer *xferbuf, void *data, size_t len)
Initialise fixed-size data transfer buffer.
Definition: xferbuf.h:81
#define NULL
NULL pointer (VOID *)
Definition: Base.h:322
#define ref_put(refcnt)
Drop reference to object.
Definition: refcnt.h:107
struct interface block
Block device interface.
Definition: blocktrans.h:23

References block_translator::blksize, blktrans_block_desc, blktrans_xfer_desc, block, block_translator::block, buffer, DBGC2, ENOMEM, intf_init(), intf_insert(), NULL, rc, ref_init, ref_put, block_translator::refcnt, size, block_translator::xfer, block_translator::xferbuf, xferbuf_fixed_init(), xferbuf_void_init(), and zalloc().

Referenced by http_block_read(), and http_block_read_capacity().

Variable Documentation

◆ blktrans_block_operations

struct interface_operation blktrans_block_operations[]
static
Initial value:
= {
}
void intf_close(struct interface *intf, int rc)
Close an object interface.
Definition: interface.c:250
static void blktrans_close(struct block_translator *blktrans, int rc)
Close block device translator.
Definition: blocktrans.c:49
A block device translator.
Definition: blocktrans.h:19
#define INTF_OP(op_type, object_type, op_func)
Define an object interface operation.
Definition: interface.h:33

Block device translator block device interface operations.

Definition at line 111 of file blocktrans.c.

◆ blktrans_block_desc

struct interface_descriptor blktrans_block_desc
static
Initial value:
=
A block device translator.
Definition: blocktrans.h:19
struct interface xfer
Data transfer interface.
Definition: blocktrans.h:25
static struct interface_operation blktrans_block_operations[]
Block device translator block device interface operations.
Definition: blocktrans.c:111
uint8_t block[3][8]
DES-encrypted blocks.
Definition: mschapv2.h:12
#define INTF_DESC_PASSTHRU(object_type, intf, operations, passthru)
Define an object interface descriptor with pass-through interface.
Definition: interface.h:98

Block device translator block device interface descriptor.

Definition at line 116 of file blocktrans.c.

Referenced by block_translate().

◆ blktrans_xfer_operations

struct interface_operation blktrans_xfer_operations[]
static
Initial value:
= {
}
void intf_close(struct interface *intf, int rc)
Close an object interface.
Definition: interface.c:250
static void blktrans_close(struct block_translator *blktrans, int rc)
Close block device translator.
Definition: blocktrans.c:49
A data transfer buffer.
Definition: xferbuf.h:19
A block device translator.
Definition: blocktrans.h:19
static struct xfer_buffer * blktrans_buffer(struct block_translator *blktrans)
Get underlying data transfer buffer.
Definition: blocktrans.c:105
#define INTF_OP(op_type, object_type, op_func)
Define an object interface operation.
Definition: interface.h:33
int xfer_deliver(struct interface *intf, struct io_buffer *iobuf, struct xfer_metadata *meta)
Deliver datagram.
Definition: xfer.c:195
static int blktrans_deliver(struct block_translator *blktrans, struct io_buffer *iobuf, struct xfer_metadata *meta)
Deliver data.
Definition: blocktrans.c:78

Block device translator data transfer interface operations.

Definition at line 121 of file blocktrans.c.

◆ blktrans_xfer_desc

struct interface_descriptor blktrans_xfer_desc
static
Initial value:
=
A block device translator.
Definition: blocktrans.h:19
struct interface xfer
Data transfer interface.
Definition: blocktrans.h:25
static struct interface_operation blktrans_xfer_operations[]
Block device translator data transfer interface operations.
Definition: blocktrans.c:121
uint8_t block[3][8]
DES-encrypted blocks.
Definition: mschapv2.h:12
#define INTF_DESC_PASSTHRU(object_type, intf, operations, passthru)
Define an object interface descriptor with pass-through interface.
Definition: interface.h:98

Block device translator data transfer interface descriptor.

Definition at line 128 of file blocktrans.c.

Referenced by block_translate().