Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

xfer.h 4.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. #ifndef _GPXE_XFER_H
  2. #define _GPXE_XFER_H
  3. /** @file
  4. *
  5. * Data transfer interfaces
  6. *
  7. */
  8. #include <stddef.h>
  9. #include <stdarg.h>
  10. #include <gpxe/interface.h>
  11. #include <gpxe/iobuf.h>
  12. struct xfer_interface;
  13. /** Data transfer interface operations */
  14. struct xfer_interface_operations {
  15. /* Missing features:
  16. *
  17. * notification of non-close status - e.g. connected/opened, ...
  18. *
  19. * seek
  20. *
  21. * prompt for data delivery
  22. *
  23. * I/O buffer preparation
  24. *
  25. */
  26. /** Close interface
  27. *
  28. * @v xfer Data transfer interface
  29. * @v rc Reason for close
  30. */
  31. void ( * close ) ( struct xfer_interface *xfer, int rc );
  32. /** Redirect to new location
  33. *
  34. * @v xfer Data transfer interface
  35. * @v type New location type
  36. * @v args Remaining arguments depend upon location type
  37. * @ret rc Return status code
  38. */
  39. int ( * vredirect ) ( struct xfer_interface *xfer, int type,
  40. va_list args );
  41. /** Seek to position
  42. *
  43. * @v xfer Data transfer interface
  44. * @v pos New position
  45. * @ret rc Return status code
  46. */
  47. int ( * seek ) ( struct xfer_interface *xfer, size_t pos );
  48. /** Deliver datagram
  49. *
  50. * @v xfer Data transfer interface
  51. * @v iobuf Datagram I/O buffer
  52. * @ret rc Return status code
  53. *
  54. * A data transfer interface that wishes to support only raw
  55. * data delivery should set this method to
  56. * deliver_as_raw().
  57. */
  58. int ( * deliver ) ( struct xfer_interface *xfer,
  59. struct io_buffer *iobuf );
  60. /** Deliver datagram as raw data
  61. *
  62. * @v xfer Data transfer interface
  63. * @v data Data buffer
  64. * @v len Length of data buffer
  65. * @ret rc Return status code
  66. *
  67. * A data transfer interface that wishes to support only I/O
  68. * buffer delivery should set this method to
  69. * deliver_as_iobuf().
  70. */
  71. int ( * deliver_raw ) ( struct xfer_interface *xfer,
  72. const void *data, size_t len );
  73. };
  74. /** A data transfer interface */
  75. struct xfer_interface {
  76. /** Generic object communication interface */
  77. struct interface intf;
  78. /** Operations for received messages */
  79. struct xfer_interface_operations *op;
  80. };
  81. extern struct xfer_interface null_xfer;
  82. extern struct xfer_interface_operations null_xfer_ops;
  83. extern void close ( struct xfer_interface *xfer, int rc );
  84. extern int seek ( struct xfer_interface *xfer, size_t pos );
  85. extern int vredirect ( struct xfer_interface *xfer, int type, va_list args );
  86. extern int redirect ( struct xfer_interface *xfer, int type, ... );
  87. extern int deliver ( struct xfer_interface *xfer, struct io_buffer *iobuf );
  88. extern int deliver_raw ( struct xfer_interface *xfer,
  89. const void *data, size_t len );
  90. extern void ignore_close ( struct xfer_interface *xfer, int rc );
  91. extern int ignore_vredirect ( struct xfer_interface *xfer,
  92. int type, va_list args );
  93. extern int ignore_seek ( struct xfer_interface *xfer, size_t pos );
  94. extern int deliver_as_raw ( struct xfer_interface *xfer,
  95. struct io_buffer *iobuf );
  96. extern int deliver_as_iobuf ( struct xfer_interface *xfer,
  97. const void *data, size_t len );
  98. extern int ignore_deliver_raw ( struct xfer_interface *xfer,
  99. const void *data __unused, size_t len );
  100. /**
  101. * Initialise a data transfer interface
  102. *
  103. * @v xfer Data transfer interface
  104. * @v op Data transfer interface operations
  105. * @v refcnt Containing object reference counter, or NULL
  106. */
  107. static inline void xfer_init ( struct xfer_interface *xfer,
  108. struct xfer_interface_operations *op,
  109. struct refcnt *refcnt ) {
  110. xfer->intf.dest = &null_xfer.intf;
  111. xfer->intf.refcnt = refcnt;
  112. xfer->op = op;
  113. }
  114. /**
  115. * Get data transfer interface from generic object communication interface
  116. *
  117. * @v intf Generic object communication interface
  118. * @ret xfer Data transfer interface
  119. */
  120. static inline struct xfer_interface *
  121. intf_to_xfer ( struct interface *intf ) {
  122. return container_of ( intf, struct xfer_interface, intf );
  123. }
  124. /**
  125. * Get destination data transfer interface
  126. *
  127. * @v xfer Data transfer interface
  128. * @ret dest Destination interface
  129. */
  130. static inline struct xfer_interface *
  131. xfer_dest ( struct xfer_interface *xfer ) {
  132. return intf_to_xfer ( xfer->intf.dest );
  133. }
  134. /**
  135. * Plug a data transfer interface into a new destination interface
  136. *
  137. * @v xfer Data transfer interface
  138. * @v dest New destination interface
  139. */
  140. static inline void xfer_plug ( struct xfer_interface *xfer,
  141. struct xfer_interface *dest ) {
  142. plug ( &xfer->intf, &dest->intf );
  143. }
  144. /**
  145. * Unplug a data transfer interface
  146. *
  147. * @v xfer Data transfer interface
  148. */
  149. static inline void xfer_unplug ( struct xfer_interface *xfer ) {
  150. plug ( &xfer->intf, &null_xfer.intf );
  151. }
  152. /**
  153. * Stop using a data transfer interface
  154. *
  155. * @v xfer Data transfer interface
  156. *
  157. * After calling this method, no further messages will be received via
  158. * the interface.
  159. */
  160. static inline void xfer_nullify ( struct xfer_interface *xfer ) {
  161. xfer->op = &null_xfer_ops;
  162. };
  163. #endif /* _GPXE_XFER_H */