iPXE
xferbuf.h
Go to the documentation of this file.
1 #ifndef _IPXE_XFERBUF_H
2 #define _IPXE_XFERBUF_H
3 
4 /** @file
5  *
6  * Data transfer buffer
7  *
8  */
9 
10 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
11 FILE_SECBOOT ( PERMITTED );
12 
13 #include <stdint.h>
14 #include <ipxe/iobuf.h>
15 #include <ipxe/interface.h>
16 #include <ipxe/xfer.h>
17 
18 /** A data transfer buffer */
19 struct xfer_buffer {
20  /** Data */
21  void *data;
22  /** Size of data */
23  size_t len;
24  /** Current offset within data */
25  size_t pos;
26  /** Data transfer buffer operations */
28 };
29 
30 /** Data transfer buffer operations */
32  /** Reallocate data buffer
33  *
34  * @v xferbuf Data transfer buffer
35  * @v len New length (or zero to free buffer)
36  * @ret rc Return status code
37  */
38  int ( * realloc ) ( struct xfer_buffer *xferbuf, size_t len );
39 };
40 
45 
46 /**
47  * Initialise malloc()-based data transfer buffer
48  *
49  * @v xferbuf Data transfer buffer
50  *
51  * Data will be automatically allocated using malloc().
52  */
53 static inline __attribute__ (( always_inline )) void
54 xferbuf_malloc_init ( struct xfer_buffer *xferbuf ) {
55  xferbuf->op = &xferbuf_malloc_operations;
56 }
57 
58 /**
59  * Initialise umalloc()-based data transfer buffer
60  *
61  * @v xferbuf Data transfer buffer
62  *
63  * Data will be automatically allocated using umalloc() (and may
64  * therefore alter the system memory map).
65  */
66 static inline __attribute__ (( always_inline )) void
67 xferbuf_umalloc_init ( struct xfer_buffer *xferbuf ) {
68  xferbuf->op = &xferbuf_umalloc_operations;
69 }
70 
71 /**
72  * Initialise fixed-size data transfer buffer
73  *
74  * @v xferbuf Data transfer buffer
75  * @v data Data buffer
76  * @v len Length of data buffer
77  *
78  * Data will be never be automatically allocated.
79  */
80 static inline __attribute__ (( always_inline )) void
81 xferbuf_fixed_init ( struct xfer_buffer *xferbuf, void *data, size_t len ) {
82  xferbuf->data = data;
83  xferbuf->len = len;
84  xferbuf->op = &xferbuf_fixed_operations;
85 }
86 
87 /**
88  * Initialise void data transfer buffer
89  *
90  * @v xferbuf Data transfer buffer
91  *
92  * No data will be allocated, but the length will be recorded. This
93  * can be used to capture xfer_seek() results.
94  */
95 static inline __attribute__ (( always_inline )) void
96 xferbuf_void_init ( struct xfer_buffer *xferbuf ) {
97  xferbuf->op = &xferbuf_void_operations;
98 }
99 
100 extern void xferbuf_detach ( struct xfer_buffer *xferbuf );
101 extern void xferbuf_free ( struct xfer_buffer *xferbuf );
102 extern int xferbuf_write ( struct xfer_buffer *xferbuf, size_t offset,
103  const void *data, size_t len );
104 extern int xferbuf_read ( struct xfer_buffer *xferbuf, size_t offset,
105  void *data, size_t len );
106 extern int xferbuf_deliver ( struct xfer_buffer *xferbuf,
107  struct io_buffer *iobuf,
108  struct xfer_metadata *meta );
109 
110 extern struct xfer_buffer * xfer_buffer ( struct interface *intf );
111 #define xfer_buffer_TYPE( object_type ) \
112  typeof ( struct xfer_buffer * ( object_type ) )
113 
114 #endif /* _IPXE_XFERBUF_H */
void * data
Data.
Definition: xferbuf.h:21
#define __attribute__(x)
Definition: compiler.h:10
Data transfer metadata.
Definition: xfer.h:23
void xferbuf_free(struct xfer_buffer *xferbuf)
Free data transfer buffer.
Definition: xferbuf.c:74
A data transfer buffer.
Definition: xferbuf.h:19
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
I/O buffers.
FILE_LICENCE(GPL2_OR_LATER_OR_UBDL)
size_t pos
Current offset within data.
Definition: xferbuf.h:25
static void xferbuf_umalloc_init(struct xfer_buffer *xferbuf)
Initialise umalloc()-based data transfer buffer.
Definition: xferbuf.h:67
static void xferbuf_void_init(struct xfer_buffer *xferbuf)
Initialise void data transfer buffer.
Definition: xferbuf.h:96
Data transfer interfaces.
Data transfer buffer operations.
Definition: xferbuf.h:31
size_t len
Size of data.
Definition: xferbuf.h:23
void xferbuf_detach(struct xfer_buffer *xferbuf)
Detach data from data transfer buffer.
Definition: xferbuf.c:62
An object interface.
Definition: interface.h:125
Object interfaces.
ring len
Length.
Definition: dwmac.h:231
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 xferbuf_malloc_init(struct xfer_buffer *xferbuf)
Initialise malloc()-based data transfer buffer.
Definition: xferbuf.h:54
struct xfer_buffer_operations xferbuf_void_operations
Void data buffer operations.
Definition: xferbuf.c:288
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
struct xfer_buffer_operations xferbuf_malloc_operations
malloc()-based data buffer operations
Definition: xferbuf.c:221
struct xfer_buffer_operations xferbuf_fixed_operations
Fixed-size data buffer operations.
Definition: xferbuf.c:268
struct xfer_buffer * xfer_buffer(struct interface *intf)
Get underlying data transfer buffer.
Definition: xferbuf.c:306
int(* realloc)(struct xfer_buffer *xferbuf, size_t len)
Reallocate data buffer.
Definition: xferbuf.h:38
int xferbuf_read(struct xfer_buffer *xferbuf, size_t offset, void *data, size_t len)
Read from data transfer buffer.
Definition: xferbuf.c:147
uint8_t data[48]
Additional event data.
Definition: ena.h:22
uint16_t offset
Offset to command line.
Definition: bzimage.h:8
uint8_t meta
Metadata flags.
Definition: ena.h:14
static void xferbuf_fixed_init(struct xfer_buffer *xferbuf, void *data, size_t len)
Initialise fixed-size data transfer buffer.
Definition: xferbuf.h:81
FILE_SECBOOT(PERMITTED)
A persistent I/O buffer.
Definition: iobuf.h:38