1 #ifndef _IPXE_XFERBUF_H
2 #define _IPXE_XFERBUF_H
10 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
13 #include <ipxe/iobuf.h>
14 #include <ipxe/uaccess.h>
15 #include <ipxe/interface.h>
16 #include <ipxe/xfer.h>
18 /** A data transfer buffer */
24 /** Current offset within data */
26 /** Data transfer buffer operations */
27 struct xfer_buffer_operations *op;
30 /** Data transfer buffer operations */
31 struct xfer_buffer_operations {
32 /** Reallocate data buffer
34 * @v xferbuf Data transfer buffer
35 * @v len New length (or zero to free buffer)
36 * @ret rc Return status code
38 int ( * realloc ) ( struct xfer_buffer *xferbuf, size_t len );
39 /** Write data to buffer
41 * @v xferbuf Data transfer buffer
42 * @v offset Starting offset
43 * @v data Data to write
44 * @v len Length of data
46 * This call is simply a wrapper for the appropriate
47 * memcpy()-like operation: the caller is responsible for
48 * ensuring that the write does not exceed the buffer length.
50 void ( * write ) ( struct xfer_buffer *xferbuf, size_t offset,
51 const void *data, size_t len );
52 /** Read data from buffer
54 * @v xferbuf Data transfer buffer
55 * @v offset Starting offset
56 * @v data Data to read
57 * @v len Length of data
59 * This call is simply a wrapper for the appropriate
60 * memcpy()-like operation: the caller is responsible for
61 * ensuring that the read does not exceed the buffer length.
63 void ( * read ) ( struct xfer_buffer *xferbuf, size_t offset,
64 void *data, size_t len );
67 extern struct xfer_buffer_operations xferbuf_malloc_operations;
68 extern struct xfer_buffer_operations xferbuf_umalloc_operations;
71 * Initialise malloc()-based data transfer buffer
73 * @v xferbuf Data transfer buffer
75 static inline __attribute__ (( always_inline )) void
76 xferbuf_malloc_init ( struct xfer_buffer *xferbuf ) {
77 xferbuf->op = &xferbuf_malloc_operations;
81 * Initialise umalloc()-based data transfer buffer
83 * @v xferbuf Data transfer buffer
84 * @v data User pointer
86 static inline __attribute__ (( always_inline )) void
87 xferbuf_umalloc_init ( struct xfer_buffer *xferbuf, userptr_t *data ) {
89 xferbuf->op = &xferbuf_umalloc_operations;
92 extern void xferbuf_free ( struct xfer_buffer *xferbuf );
93 extern int xferbuf_write ( struct xfer_buffer *xferbuf, size_t offset,
94 const void *data, size_t len );
95 extern int xferbuf_read ( struct xfer_buffer *xferbuf, size_t offset,
96 void *data, size_t len );
97 extern int xferbuf_deliver ( struct xfer_buffer *xferbuf,
98 struct io_buffer *iobuf,
99 struct xfer_metadata *meta );
101 extern struct xfer_buffer * xfer_buffer ( struct interface *intf );
102 #define xfer_buffer_TYPE( object_type ) \
103 typeof ( struct xfer_buffer * ( object_type ) )
105 #endif /* _IPXE_XFERBUF_H */