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