You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

xfer.h 7.7KB

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