iPXE
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.
static int blktrans_deliver (struct block_translator *blktrans, struct io_buffer *iobuf, struct xfer_metadata *meta)
 Deliver data.
static struct xfer_bufferblktrans_buffer (struct block_translator *blktrans)
 Get underlying data transfer buffer.
int block_translate (struct interface *block, void *buffer, size_t size)
 Insert block device translator.

Variables

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

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

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:3
void block_capacity(struct interface *intf, struct block_device_capacity *capacity)
Report block device capacity.
Definition blockdev.c:130
void intf_shutdown(struct interface *intf, int rc)
Shut down an object interface.
Definition interface.c:279
Block device capacity.
Definition blockdev.h:18
struct interface xfer
Data transfer interface.
Definition blocktrans.h:25
size_t blksize
Block size.
Definition blocktrans.h:30
struct xfer_buffer xferbuf
Data transfer buffer.
Definition blocktrans.h:28
struct interface block
Block device interface.
Definition blocktrans.h:23
size_t len
Size of data.
Definition xferbuf.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()

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}
static void blktrans_close(struct block_translator *blktrans, int rc)
Close block device translator.
Definition blocktrans.c:49
uint8_t meta
Metadata flags.
Definition ena.h:3
#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
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

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

◆ blktrans_buffer()

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}

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}
#define NULL
NULL pointer (VOID *)
Definition Base.h:322
static struct interface_descriptor blktrans_xfer_desc
Block device translator data transfer interface descriptor.
Definition blocktrans.c:128
static struct interface_descriptor blktrans_block_desc
Block device translator block device interface descriptor.
Definition blocktrans.c:116
#define DBGC2(...)
Definition compiler.h:522
uint16_t size
Buffer size.
Definition dwmac.h:3
uint32_t buffer
Buffer index (or NETVSC_RNDIS_NO_BUFFER)
Definition netvsc.h:5
#define ENOMEM
Not enough space.
Definition errno.h:535
void intf_insert(struct interface *intf, struct interface *upper, struct interface *lower)
Insert a filter interface.
Definition interface.c:402
static void intf_init(struct interface *intf, struct interface_descriptor *desc, struct refcnt *refcnt)
Initialise an object interface.
Definition interface.h:204
void * zalloc(size_t size)
Allocate cleared memory.
Definition malloc.c:662
uint8_t block[3][8]
DES-encrypted blocks.
Definition mschapv2.h:1
#define ref_put(refcnt)
Drop reference to object.
Definition refcnt.h:107
#define ref_init(refcnt, free)
Initialise a reference counter.
Definition refcnt.h:65
A block device translator.
Definition blocktrans.h:19
struct refcnt refcnt
Reference count.
Definition blocktrans.h:21
static void xferbuf_fixed_init(struct xfer_buffer *xferbuf, void *data, size_t len)
Initialise fixed-size data transfer buffer.
Definition xferbuf.h:81
static void xferbuf_void_init(struct xfer_buffer *xferbuf)
Initialise void data transfer buffer.
Definition xferbuf.h:96

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

111 {
113};

◆ blktrans_block_desc

struct interface_descriptor blktrans_block_desc
static
Initial value:
=
static struct interface_operation blktrans_block_operations[]
Block device translator block device interface operations.
Definition blocktrans.c:111
#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:
= {
}
static struct xfer_buffer * blktrans_buffer(struct block_translator *blktrans)
Get underlying data transfer buffer.
Definition blocktrans.c:105
static int blktrans_deliver(struct block_translator *blktrans, struct io_buffer *iobuf, struct xfer_metadata *meta)
Deliver data.
Definition blocktrans.c:78
A data transfer buffer.
Definition xferbuf.h:19
int xfer_deliver(struct interface *intf, struct io_buffer *iobuf, struct xfer_metadata *meta)
Deliver datagram.
Definition xfer.c:195

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:
=
static struct interface_operation blktrans_xfer_operations[]
Block device translator data transfer interface operations.
Definition blocktrans.c:121

Block device translator data transfer interface descriptor.

Definition at line 128 of file blocktrans.c.

Referenced by block_translate().