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

◆ 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 48 of file blocktrans.c.

48  {
49  struct block_device_capacity capacity;
50 
51  /* Report block device capacity, if applicable */
52  if ( ( rc == 0 ) && ( blktrans->blksize ) ) {
53 
54  /* Construct block device capacity */
55  capacity.blocks =
56  ( blktrans->xferbuf.len / blktrans->blksize );
57  capacity.blksize = blktrans->blksize;
58  capacity.max_count = -1U;
59 
60  /* Report block device capacity */
61  block_capacity ( &blktrans->block, &capacity );
62  }
63 
64  /* Shut down interfaces */
65  intf_shutdown ( &blktrans->xfer, rc );
66  intf_shutdown ( &blktrans->block, rc );
67 }
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:278
void block_capacity(struct interface *intf, struct block_device_capacity *capacity)
Report block device capacity.
Definition: blockdev.c:129
size_t len
Size of data.
Definition: xferbuf.h:22
uint64_t blocks
Total number of blocks.
Definition: blockdev.h:19
struct interface xfer
Data transfer interface.
Definition: blocktrans.h:24
Block device capacity.
Definition: blockdev.h:17
struct xfer_buffer xferbuf
Data transfer buffer.
Definition: blocktrans.h:27
size_t blksize
Block size.
Definition: blocktrans.h:29
struct interface block
Block device interface.
Definition: blocktrans.h:22

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 77 of file blocktrans.c.

79  {
80  int rc;
81 
82  /* Deliver to buffer */
83  if ( ( rc = xferbuf_deliver ( &blktrans->xferbuf, iob_disown ( iobuf ),
84  meta ) ) != 0 ) {
85  DBGC ( blktrans, "BLKTRANS %p could not deliver: %s\n",
86  blktrans, strerror ( rc ) );
87  goto err;
88  }
89 
90  return 0;
91 
92  err:
93  blktrans_close ( blktrans, rc );
94  return rc;
95 }
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:174
static void blktrans_close(struct block_translator *blktrans, int rc)
Close block device translator.
Definition: blocktrans.c:48
#define DBGC(...)
Definition: compiler.h:505
#define iob_disown(iobuf)
Disown an I/O buffer.
Definition: iobuf.h:216
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
struct xfer_buffer xferbuf
Data transfer buffer.
Definition: blocktrans.h:27
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 104 of file blocktrans.c.

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

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 139 of file blocktrans.c.

139  {
140  struct block_translator *blktrans;
141  int rc;
142 
143  /* Allocate and initialise structure */
144  blktrans = zalloc ( sizeof ( *blktrans ) );
145  if ( ! blktrans ) {
146  rc = -ENOMEM;
147  goto err_alloc;
148  }
149  ref_init ( &blktrans->refcnt, NULL );
150  intf_init ( &blktrans->block, &blktrans_block_desc, &blktrans->refcnt );
151  intf_init ( &blktrans->xfer, &blktrans_xfer_desc, &blktrans->refcnt );
152  if ( buffer ) {
153  xferbuf_fixed_init ( &blktrans->xferbuf, buffer, size );
154  } else {
155  xferbuf_void_init ( &blktrans->xferbuf );
156  blktrans->blksize = size;
157  }
158 
159  /* Attach to interfaces, mortalise self, and return */
160  intf_insert ( block, &blktrans->block, &blktrans->xfer );
161  ref_put ( &blktrans->refcnt );
162 
163  DBGC2 ( blktrans, "BLKTRANS %p created", blktrans );
164  if ( buffer ) {
165  DBGC2 ( blktrans, " for %#lx+%#zx",
166  virt_to_phys ( buffer ), size );
167  }
168  DBGC2 ( blktrans, "\n" );
169  return 0;
170 
171  ref_put ( &blktrans->refcnt );
172  err_alloc:
173  return rc;
174 }
struct refcnt refcnt
Reference count.
Definition: blocktrans.h:20
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:115
#define ref_init(refcnt, free)
Initialise a reference counter.
Definition: refcnt.h:64
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:95
#define ENOMEM
Not enough space.
Definition: errno.h:534
A block device translator.
Definition: blocktrans.h:18
struct interface xfer
Data transfer interface.
Definition: blocktrans.h:24
void * zalloc(size_t size)
Allocate cleared memory.
Definition: malloc.c:661
static struct interface_descriptor blktrans_xfer_desc
Block device translator data transfer interface descriptor.
Definition: blocktrans.c:127
void intf_insert(struct interface *intf, struct interface *upper, struct interface *lower)
Insert a filter interface.
Definition: interface.c:401
#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:27
size_t blksize
Block size.
Definition: blocktrans.h:29
static void intf_init(struct interface *intf, struct interface_descriptor *desc, struct refcnt *refcnt)
Initialise an object interface.
Definition: interface.h:203
static void xferbuf_fixed_init(struct xfer_buffer *xferbuf, void *data, size_t len)
Initialise fixed-size data transfer buffer.
Definition: xferbuf.h:80
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
#define ref_put(refcnt)
Drop reference to object.
Definition: refcnt.h:106
struct interface block
Block device interface.
Definition: blocktrans.h:22

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:249
static void blktrans_close(struct block_translator *blktrans, int rc)
Close block device translator.
Definition: blocktrans.c:48
A block device translator.
Definition: blocktrans.h:18
#define INTF_OP(op_type, object_type, op_func)
Define an object interface operation.
Definition: interface.h:32

Block device translator block device interface operations.

Definition at line 110 of file blocktrans.c.

◆ blktrans_block_desc

struct interface_descriptor blktrans_block_desc
static
Initial value:
=
A block device translator.
Definition: blocktrans.h:18
struct interface xfer
Data transfer interface.
Definition: blocktrans.h:24
static struct interface_operation blktrans_block_operations[]
Block device translator block device interface operations.
Definition: blocktrans.c:110
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:97

Block device translator block device interface descriptor.

Definition at line 115 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:249
static void blktrans_close(struct block_translator *blktrans, int rc)
Close block device translator.
Definition: blocktrans.c:48
A data transfer buffer.
Definition: xferbuf.h:18
A block device translator.
Definition: blocktrans.h:18
static struct xfer_buffer * blktrans_buffer(struct block_translator *blktrans)
Get underlying data transfer buffer.
Definition: blocktrans.c:104
#define INTF_OP(op_type, object_type, op_func)
Define an object interface operation.
Definition: interface.h:32
int xfer_deliver(struct interface *intf, struct io_buffer *iobuf, struct xfer_metadata *meta)
Deliver datagram.
Definition: xfer.c:194
static int blktrans_deliver(struct block_translator *blktrans, struct io_buffer *iobuf, struct xfer_metadata *meta)
Deliver data.
Definition: blocktrans.c:77

Block device translator data transfer interface operations.

Definition at line 120 of file blocktrans.c.

◆ blktrans_xfer_desc

struct interface_descriptor blktrans_xfer_desc
static
Initial value:
=
A block device translator.
Definition: blocktrans.h:18
struct interface xfer
Data transfer interface.
Definition: blocktrans.h:24
static struct interface_operation blktrans_xfer_operations[]
Block device translator data transfer interface operations.
Definition: blocktrans.c:120
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:97

Block device translator data transfer interface descriptor.

Definition at line 127 of file blocktrans.c.

Referenced by block_translate().