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.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. #ifndef _IPXE_XFER_H
  2. #define _IPXE_XFER_H
  3. /** @file
  4. *
  5. * Data transfer interfaces
  6. *
  7. */
  8. FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
  9. #include <stddef.h>
  10. #include <stdarg.h>
  11. #include <ipxe/interface.h>
  12. struct xfer_metadata;
  13. struct io_buffer;
  14. struct sockaddr;
  15. struct net_device;
  16. /** Data transfer metadata */
  17. struct xfer_metadata {
  18. /** Flags
  19. *
  20. * This is the bitwise OR of zero or more @c XFER_FL_XXX
  21. * constants.
  22. */
  23. unsigned int flags;
  24. /** Offset of data within stream
  25. *
  26. * This is an absolute offset if the @c XFER_FL_ABS_OFFSET
  27. * flag is set, otherwise a relative offset. (A freshly
  28. * zeroed @c xfer_metadata structure therefore represents a
  29. * relative offset of zero, i.e. no offset from the current
  30. * position.)
  31. */
  32. off_t offset;
  33. /** Source socket address, or NULL */
  34. struct sockaddr *src;
  35. /** Destination socket address, or NULL */
  36. struct sockaddr *dest;
  37. /** Network device, or NULL */
  38. struct net_device *netdev;
  39. };
  40. /** Offset is absolute */
  41. #define XFER_FL_ABS_OFFSET 0x0001
  42. /** Sender is relinquishing use of half-duplex channel */
  43. #define XFER_FL_OVER 0x0002
  44. /** This is the final data transfer */
  45. #define XFER_FL_OUT 0x0004
  46. /** Data content represents a command or status message
  47. *
  48. * The flag @c XFER_FL_RESPONSE is used to distinguish between a
  49. * command message and a status message.
  50. */
  51. #define XFER_FL_CMD_STAT 0x0008
  52. /** Data content is a response */
  53. #define XFER_FL_RESPONSE 0x0010
  54. /* Data transfer interface operations */
  55. extern int xfer_vredirect ( struct interface *intf, int type,
  56. va_list args );
  57. #define xfer_vredirect_TYPE( object_type ) \
  58. typeof ( int ( object_type, int type, va_list args ) )
  59. extern size_t xfer_window ( struct interface *intf );
  60. #define xfer_window_TYPE( object_type ) \
  61. typeof ( size_t ( object_type ) )
  62. extern void xfer_window_changed ( struct interface *intf );
  63. #define xfer_window_changed_TYPE( object_type ) \
  64. typeof ( void ( object_type ) )
  65. extern struct io_buffer * xfer_alloc_iob ( struct interface *intf,
  66. size_t len );
  67. #define xfer_alloc_iob_TYPE( object_type ) \
  68. typeof ( struct io_buffer * ( object_type, size_t len ) )
  69. extern int xfer_deliver ( struct interface *intf,
  70. struct io_buffer *iobuf,
  71. struct xfer_metadata *meta );
  72. #define xfer_deliver_TYPE( object_type ) \
  73. typeof ( int ( object_type, struct io_buffer *iobuf, \
  74. struct xfer_metadata *meta ) )
  75. /* Data transfer interface helper functions */
  76. extern int xfer_redirect ( struct interface *xfer, int type, ... );
  77. extern int xfer_deliver_iob ( struct interface *intf,
  78. struct io_buffer *iobuf );
  79. extern int xfer_deliver_raw_meta ( struct interface *intf, const void *data,
  80. size_t len, struct xfer_metadata *meta );
  81. extern int xfer_deliver_raw ( struct interface *intf,
  82. const void *data, size_t len );
  83. extern int xfer_vprintf ( struct interface *intf,
  84. const char *format, va_list args );
  85. extern int __attribute__ (( format ( printf, 2, 3 ) ))
  86. xfer_printf ( struct interface *intf, const char *format, ... );
  87. extern int xfer_seek ( struct interface *intf, off_t offset );
  88. extern int xfer_check_order ( struct xfer_metadata *meta, size_t *pos,
  89. size_t len );
  90. #endif /* _IPXE_XFER_H */