選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

xferbuf.h 2.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. #ifndef _IPXE_XFERBUF_H
  2. #define _IPXE_XFERBUF_H
  3. /** @file
  4. *
  5. * Data transfer buffer
  6. *
  7. */
  8. FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
  9. #include <stdint.h>
  10. #include <ipxe/iobuf.h>
  11. #include <ipxe/uaccess.h>
  12. #include <ipxe/interface.h>
  13. #include <ipxe/xfer.h>
  14. /** A data transfer buffer */
  15. struct xfer_buffer {
  16. /** Data */
  17. void *data;
  18. /** Size of data */
  19. size_t len;
  20. /** Current offset within data */
  21. size_t pos;
  22. /** Data transfer buffer operations */
  23. struct xfer_buffer_operations *op;
  24. };
  25. /** Data transfer buffer operations */
  26. struct xfer_buffer_operations {
  27. /** Reallocate data buffer
  28. *
  29. * @v xferbuf Data transfer buffer
  30. * @v len New length (or zero to free buffer)
  31. * @ret rc Return status code
  32. */
  33. int ( * realloc ) ( struct xfer_buffer *xferbuf, size_t len );
  34. /** Write data to buffer
  35. *
  36. * @v xferbuf Data transfer buffer
  37. * @v offset Starting offset
  38. * @v data Data to write
  39. * @v len Length of data
  40. *
  41. * This call is simply a wrapper for the appropriate
  42. * memcpy()-like operation: the caller is responsible for
  43. * ensuring that the write does not exceed the buffer length.
  44. */
  45. void ( * write ) ( struct xfer_buffer *xferbuf, size_t offset,
  46. const void *data, size_t len );
  47. /** Read data from buffer
  48. *
  49. * @v xferbuf Data transfer buffer
  50. * @v offset Starting offset
  51. * @v data Data to read
  52. * @v len Length of data
  53. *
  54. * This call is simply a wrapper for the appropriate
  55. * memcpy()-like operation: the caller is responsible for
  56. * ensuring that the read does not exceed the buffer length.
  57. */
  58. void ( * read ) ( struct xfer_buffer *xferbuf, size_t offset,
  59. void *data, size_t len );
  60. };
  61. extern struct xfer_buffer_operations xferbuf_malloc_operations;
  62. extern struct xfer_buffer_operations xferbuf_umalloc_operations;
  63. /**
  64. * Initialise malloc()-based data transfer buffer
  65. *
  66. * @v xferbuf Data transfer buffer
  67. */
  68. static inline __attribute__ (( always_inline )) void
  69. xferbuf_malloc_init ( struct xfer_buffer *xferbuf ) {
  70. xferbuf->op = &xferbuf_malloc_operations;
  71. }
  72. /**
  73. * Initialise umalloc()-based data transfer buffer
  74. *
  75. * @v xferbuf Data transfer buffer
  76. * @v data User pointer
  77. */
  78. static inline __attribute__ (( always_inline )) void
  79. xferbuf_umalloc_init ( struct xfer_buffer *xferbuf, userptr_t *data ) {
  80. xferbuf->data = data;
  81. xferbuf->op = &xferbuf_umalloc_operations;
  82. }
  83. extern void xferbuf_free ( struct xfer_buffer *xferbuf );
  84. extern int xferbuf_write ( struct xfer_buffer *xferbuf, size_t offset,
  85. const void *data, size_t len );
  86. extern int xferbuf_read ( struct xfer_buffer *xferbuf, size_t offset,
  87. void *data, size_t len );
  88. extern int xferbuf_deliver ( struct xfer_buffer *xferbuf,
  89. struct io_buffer *iobuf,
  90. struct xfer_metadata *meta );
  91. extern struct xfer_buffer * xfer_buffer ( struct interface *intf );
  92. #define xfer_buffer_TYPE( object_type ) \
  93. typeof ( struct xfer_buffer * ( object_type ) )
  94. #endif /* _IPXE_XFERBUF_H */