Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  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. struct xfer_metadata;
  14. /** Data transfer interface operations */
  15. struct xfer_interface_operations {
  16. /** Close interface
  17. *
  18. * @v xfer Data transfer interface
  19. * @v rc Reason for close
  20. */
  21. void ( * close ) ( struct xfer_interface *xfer, int rc );
  22. /** Redirect to new location
  23. *
  24. * @v xfer Data transfer interface
  25. * @v type New location type
  26. * @v args Remaining arguments depend upon location type
  27. * @ret rc Return status code
  28. */
  29. int ( * vredirect ) ( struct xfer_interface *xfer, int type,
  30. va_list args );
  31. /** Check flow control window
  32. *
  33. * @v xfer Data transfer interface
  34. * @ret len Length of window
  35. *
  36. * Flow control is regarded as advisory but not mandatory.
  37. * Users who have control over their own rate of data
  38. * generation should perform a flow control check before
  39. * generating new data. Users who have no control (such as
  40. * NIC drivers or filter layers) are not obliged to check.
  41. *
  42. * Data transfer interfaces must be prepared to accept
  43. * datagrams even if they are advertising a window of zero
  44. * bytes.
  45. */
  46. size_t ( * window ) ( struct xfer_interface *xfer );
  47. /** Allocate I/O buffer
  48. *
  49. * @v xfer Data transfer interface
  50. * @v len I/O buffer payload length
  51. * @ret iobuf I/O buffer
  52. */
  53. struct io_buffer * ( * alloc_iob ) ( struct xfer_interface *xfer,
  54. size_t len );
  55. /** Deliver datagram as I/O buffer with metadata
  56. *
  57. * @v xfer Data transfer interface
  58. * @v iobuf Datagram I/O buffer
  59. * @v meta Data transfer metadata
  60. * @ret rc Return status code
  61. *
  62. * A data transfer interface that wishes to support only raw
  63. * data delivery should set this method to
  64. * xfer_deliver_as_raw().
  65. */
  66. int ( * deliver_iob ) ( struct xfer_interface *xfer,
  67. struct io_buffer *iobuf,
  68. struct xfer_metadata *meta );
  69. /** Deliver datagram as raw data
  70. *
  71. * @v xfer Data transfer interface
  72. * @v data Data buffer
  73. * @v len Length of data buffer
  74. * @ret rc Return status code
  75. *
  76. * A data transfer interface that wishes to support only I/O
  77. * buffer delivery should set this method to
  78. * xfer_deliver_as_iob().
  79. */
  80. int ( * deliver_raw ) ( struct xfer_interface *xfer,
  81. const void *data, size_t len );
  82. };
  83. /** A data transfer interface */
  84. struct xfer_interface {
  85. /** Generic object communication interface */
  86. struct interface intf;
  87. /** Operations for received messages */
  88. struct xfer_interface_operations *op;
  89. };
  90. /** Basis positions for seek() events */
  91. enum seek_whence {
  92. SEEK_CUR = 0,
  93. SEEK_SET,
  94. };
  95. /** Data transfer metadata */
  96. struct xfer_metadata {
  97. /** Position of data within stream */
  98. off_t offset;
  99. /** Basis for data position
  100. *
  101. * Must be one of @c SEEK_CUR or @c SEEK_SET.
  102. */
  103. int whence;
  104. /** Source socket address, or NULL */
  105. struct sockaddr *src;
  106. /** Destination socket address, or NULL */
  107. struct sockaddr *dest;
  108. /** Network device, or NULL */
  109. struct net_device *netdev;
  110. };
  111. /**
  112. * Describe seek basis
  113. *
  114. * @v whence Basis for new position
  115. */
  116. static inline __attribute__ (( always_inline )) const char *
  117. whence_text ( int whence ) {
  118. switch ( whence ) {
  119. case SEEK_CUR: return "CUR";
  120. case SEEK_SET: return "SET";
  121. default: return "INVALID";
  122. }
  123. }
  124. extern struct xfer_interface null_xfer;
  125. extern struct xfer_interface_operations null_xfer_ops;
  126. extern void xfer_close ( struct xfer_interface *xfer, int rc );
  127. extern int xfer_vredirect ( struct xfer_interface *xfer, int type,
  128. va_list args );
  129. extern int xfer_redirect ( struct xfer_interface *xfer, int type, ... );
  130. extern size_t xfer_window ( struct xfer_interface *xfer );
  131. extern struct io_buffer * xfer_alloc_iob ( struct xfer_interface *xfer,
  132. size_t len );
  133. extern int xfer_deliver_iob ( struct xfer_interface *xfer,
  134. struct io_buffer *iobuf );
  135. extern int xfer_deliver_iob_meta ( struct xfer_interface *xfer,
  136. struct io_buffer *iobuf,
  137. struct xfer_metadata *meta );
  138. extern int xfer_deliver_raw ( struct xfer_interface *xfer,
  139. const void *data, size_t len );
  140. extern int xfer_vprintf ( struct xfer_interface *xfer,
  141. const char *format, va_list args );
  142. extern int xfer_printf ( struct xfer_interface *xfer,
  143. const char *format, ... );
  144. extern int xfer_seek ( struct xfer_interface *xfer, off_t offset, int whence );
  145. extern void ignore_xfer_close ( struct xfer_interface *xfer, int rc );
  146. extern int ignore_xfer_vredirect ( struct xfer_interface *xfer,
  147. int type, va_list args );
  148. extern size_t unlimited_xfer_window ( struct xfer_interface *xfer );
  149. extern size_t no_xfer_window ( struct xfer_interface *xfer );
  150. extern struct io_buffer * default_xfer_alloc_iob ( struct xfer_interface *xfer,
  151. size_t len );
  152. extern int xfer_deliver_as_raw ( struct xfer_interface *xfer,
  153. struct io_buffer *iobuf,
  154. struct xfer_metadata *meta );
  155. extern int xfer_deliver_as_iob ( struct xfer_interface *xfer,
  156. const void *data, size_t len );
  157. extern int ignore_xfer_deliver_raw ( struct xfer_interface *xfer,
  158. const void *data __unused, size_t len );
  159. /**
  160. * Initialise a data transfer interface
  161. *
  162. * @v xfer Data transfer interface
  163. * @v op Data transfer interface operations
  164. * @v refcnt Containing object reference counter, or NULL
  165. */
  166. static inline void xfer_init ( struct xfer_interface *xfer,
  167. struct xfer_interface_operations *op,
  168. struct refcnt *refcnt ) {
  169. xfer->intf.dest = &null_xfer.intf;
  170. xfer->intf.refcnt = refcnt;
  171. xfer->op = op;
  172. }
  173. /**
  174. * Initialise a static data transfer interface
  175. *
  176. * @v operations Data transfer interface operations
  177. */
  178. #define XFER_INIT( operations ) { \
  179. .intf = { \
  180. .dest = &null_xfer.intf, \
  181. .refcnt = NULL, \
  182. }, \
  183. .op = operations, \
  184. }
  185. /**
  186. * Get data transfer interface from generic object communication interface
  187. *
  188. * @v intf Generic object communication interface
  189. * @ret xfer Data transfer interface
  190. */
  191. static inline __attribute__ (( always_inline )) struct xfer_interface *
  192. intf_to_xfer ( struct interface *intf ) {
  193. return container_of ( intf, struct xfer_interface, intf );
  194. }
  195. /**
  196. * Get reference to destination data transfer interface
  197. *
  198. * @v xfer Data transfer interface
  199. * @ret dest Destination interface
  200. */
  201. static inline __attribute__ (( always_inline )) struct xfer_interface *
  202. xfer_get_dest ( struct xfer_interface *xfer ) {
  203. return intf_to_xfer ( intf_get ( xfer->intf.dest ) );
  204. }
  205. /**
  206. * Drop reference to data transfer interface
  207. *
  208. * @v xfer Data transfer interface
  209. */
  210. static inline __attribute__ (( always_inline )) void
  211. xfer_put ( struct xfer_interface *xfer ) {
  212. intf_put ( &xfer->intf );
  213. }
  214. /**
  215. * Plug a data transfer interface into a new destination interface
  216. *
  217. * @v xfer Data transfer interface
  218. * @v dest New destination interface
  219. */
  220. static inline __attribute__ (( always_inline )) void
  221. xfer_plug ( struct xfer_interface *xfer, struct xfer_interface *dest ) {
  222. plug ( &xfer->intf, &dest->intf );
  223. }
  224. /**
  225. * Plug two data transfer interfaces together
  226. *
  227. * @v a Data transfer interface A
  228. * @v b Data transfer interface B
  229. */
  230. static inline __attribute__ (( always_inline )) void
  231. xfer_plug_plug ( struct xfer_interface *a, struct xfer_interface *b ) {
  232. plug_plug ( &a->intf, &b->intf );
  233. }
  234. /**
  235. * Unplug a data transfer interface
  236. *
  237. * @v xfer Data transfer interface
  238. */
  239. static inline __attribute__ (( always_inline )) void
  240. xfer_unplug ( struct xfer_interface *xfer ) {
  241. plug ( &xfer->intf, &null_xfer.intf );
  242. }
  243. /**
  244. * Stop using a data transfer interface
  245. *
  246. * @v xfer Data transfer interface
  247. *
  248. * After calling this method, no further messages will be received via
  249. * the interface.
  250. */
  251. static inline void xfer_nullify ( struct xfer_interface *xfer ) {
  252. xfer->op = &null_xfer_ops;
  253. };
  254. #endif /* _GPXE_XFER_H */